当前位置: 首页 > 面试题库 >

为什么这段关于golang goruntine运行顺序的代码首先是“ 2”

龙宣
2023-03-14
问题内容
package main

import (
    "fmt"
    "sync"
)

func main() {
    runtime.GOMAXPROCS(1)
    w := &sync.WaitGroup{}
    w.Add(2)
    go func() {
        fmt.Println("1")
        w.Done()
    }()
    go func() {
        fmt.Println("2")
        w.Done()
    }()
    w.Wait()
}

https://play.golang.org/p/ESi1mKAo1x_S

嗯,我不知道为什么先打印“ 2”。

我想检查信息。但是我不知道应该检查什么信息,因此我在此处发布问题以寻求帮助。

我认为第一个goroutine是第一个推送队列。它应该首先打印。


问题答案:

您不会将两个已启动的goroutine 彼此
同步,因此无法保证它们以什么顺序运行。您唯一要同步的是等待其他2个完成的主要goroutine,但是它们的顺序是不确定的。

这是一个使用另一个同步订单的示例sync.WaitGroup

w := &sync.WaitGroup{}
w.Add(2)

w2 := &sync.WaitGroup{}
w2.Add(1)
go func() {
    fmt.Println("1")
    w.Done()
    w2.Done()
}()
go func() {
    w2.Wait()
    fmt.Println("2")
    w.Done()
}()
w.Wait()

输出将是(在Go Playground上尝试):

1
2

基本上,第二个goroutine等待w2,一旦完成,它就会在第一个goroutine中调用。

请注意,由于第二个goroutine等待第一个goroutine,所以只需要等待第二个goroutine就可以了(传递式地等待这两个)。所以上面的例子可以这样写:

w2 := &sync.WaitGroup{}
w2.Add(1)
go func() {
    fmt.Println("1")
    w2.Done()
}()

w := &sync.WaitGroup{}
w.Add(1)
go func() {
    w2.Wait()
    fmt.Println("2")
    w.Done()
}()
w.Wait()

输出是相同的。在Go Playground上尝试一下。



 类似资料:
  • 我想把这段代码添加到我的Java文件中: 但我不知道在哪。这是我的Java文件:包sherdle.donald.duck.app;导入android.app.activity;导入Android.os.bundle;导入Android.View.Window;导入android.webkit.webchromeclient;导入android.webkit.webview;导入Android.We

  • 我写了一些欧拉问题35的代码: 我想知道为什么这个代码(上图)运行得这么快,当我设置在函数中。这段代码的运行时间约为8秒。最初,我没有设置,我的函数是这样的: 我的初始代码(没有)运行了很长时间,我没有等它完成。我很好奇,为什么这两段代码在运行时间上存在如此大的差异,因为我不相信会有任何重复项,这会使迭代花费如此长的时间,以至于迭代。也许我对set()的想法是错误的。欢迎任何帮助。

  • 问题内容: 我试图弄清楚为什么我的一个css类似乎覆盖了另一个(而不是相反) 这里我有两个CSS类 在我看来,我打电话给 字体(重叠元素)显示为10px而不是20px-有人可以解释为什么会这样吗? 问题答案: 有几条规则(按此顺序应用): 内联css(html样式属性)覆盖样式标签和css文件中的css规则 较具体的选择器优先于较不具体的选择器 如果两个规则具有相同的特异性,则稍后出现在代码中的规

  • 问题内容: 考虑以下命令行 哪些设置适用于JVM最小内存(可选):128m或256m? 问题答案: 取决于JVM,可能取决于版本……甚至可能当时您的办公桌上有多少回形针。它甚至可能不起作用。不要那样做 如果由于某种原因无法控制它,则以与运行jar相同的方式进行编译和运行。但是要警告,依靠选项的顺序是一个非常糟糕的主意。

  • 问题内容: 此代码来自Python的文档。我有点困惑。 以下是我最初的想法: 为什么这段代码会创建一个无限循环,而第一个却没有呢? 问题答案: 这是陷阱之一!python,可以逃脱初学者。 这是这里的魔术酱。 观察: 现在没有: 这里要注意的主要事情是返回现有列表的a,因此您要遍历未修改的副本。 您可以使用以下命令检查是否引用了相同的列表: 在第一种情况下: 在第二种情况下: 值得注意的是,它称为

  • 我正在学习Scala语言,我不明白这段代码: 当是时,是从的范围是什么意思?