gpt4 book ai didi

go - 试图理解 goroutines

转载 作者:IT王子 更新时间:2023-10-29 01:49:40 24 4
gpt4 key购买 nike

我一直在研究 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com