go - 试图理解 goroutines

标签 go goroutine

我一直在研究 A Tour of Go 中的以下代码,但是当我应用一些小的更改时,我不明白发生了什么。原代码是这样的

package main

import (
    "fmt"
    "time"
)

func say(s string) {
    for i := 0; i < 5; i++ {
        time.Sleep(100 * time.Millisecond)
        fmt.Println(s)
    }
}

func main() {
    go say("world")
    say("hello")
}

它产生了这个

world
hello
hello
world
world
hello
hello
world
world
hello

没关系:五次你好,五次世界。当我打电话时我开始变得奇怪

say("world")
go say("hello")

现在输出只是

world
world
world
world
world

没有任何问候。有两个 goroutine 就更奇怪了

go say("world")
go say("hello")

现在根本没有输出。当我改变 i < 5i < 2并调用

go say("world")
say("hello")

我明白了

world
hello
hello

我在这里错过了什么?

最佳答案

如果是

 say("world")
 go say("hello")

“world”调用必须在“hello”goroutine 启动之前完成。 “你好”goroutine 没有运行或完成because main returns .

为了

go say("world")
go say("hello")

goroutines 没有运行或完成,因为 main 返回。

使用sync.WaitGroup防止 main 在 goroutines 完成之前退出:

func say(wg *sync.WaitGroup, s string) {
  defer wg.Done()
  for i := 0; i < 5; i++ {
    time.Sleep(100 * time.Millisecond)
    fmt.Println(s)
  }
}

func main() {
  var wg sync.WaitGroup
  wg.Add(2)
  go say(&wg, "world")
  go say(&wg, "hello")
  wg.Wait()
}

playground example

关于go - 试图理解 goroutines,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36677614/

相关文章:

go - 是否需要同步?

go - goroutine共享变量显示

通过 Visual Studio Code : Imports do not work. 的 GoLang 扩展从常规命令行构建和测试正常

go - 在不声明结构的情况下传递接口(interface)对象

go - go 中包含库的类型不匹配

go - 改变 goroutine 休眠的时间

select - 跳出选择循环?

go - GoSNMP 中的对象名称而不是 OID

go - 使用 Golang 的 SSH 指纹

multithreading - Go运行时使用的线程数