gpt4 book ai didi

GoRoutines,具有 WaitGroup 意外输出的 channel

转载 作者:IT王子 更新时间:2023-10-29 00:54:04 26 4
gpt4 key购买 nike

我看了很久以前写的一些代码,当时 go1.3 发布(我可能是错的)。 CODE HERE

下面的代码曾经按预期工作,但现在因为我更新了 go到当前主版本(go version devel +bd1efd5 Fri Jul 31 16:11:21 2015 +0000 darwin/amd64),最后输出信息c <- "FUNC 1 DONE"未打印,代码在 play.golang.org 上正常工作.是我做错了什么,还是这是一个错误?

package main

import ("fmt";"sync";"time")

func test(c chan string, wg *sync.WaitGroup) {
defer wg.Done()
fmt.Println("EXEC FUNC 1")
time.Sleep(3 * time.Second)
c <- "FUNC 1 DONE"
}

func test1(c chan string, wg *sync.WaitGroup) {
defer wg.Done()
fmt.Println("EXEC FUNC 2")
time.Sleep(2 * time.Second)
c <- "FUNC 2 DONE"
}

func main() {
ch := make(chan string)

var wg sync.WaitGroup
wg.Add(2)

go test(ch, &wg)
go test1(ch, &wg)

go func(c chan string) {
for txt := range c {
fmt.Println(txt)
}
}(ch)

wg.Wait()
}

更新:

我并不是说,以上是完成这些类型工作的最佳方式,但我认为它没有任何问题。

还在 go version go1.4.2 darwin/amd64 中运行它将返回预期的输出。

最佳答案

你的代码一直有这个错误。您的程序在 main 退出之前设法打印所有消息纯属偶然。

为了使其正常工作,我将反转您拥有 wg.Wait() 和 channel 接收的位置,以便您可以异步关闭 channel 。这样,接收操作就会阻塞 main,并且一旦所有发送操作完成, channel 就会关闭。

func main() {
ch := make(chan string)

var wg sync.WaitGroup
wg.Add(2)

go test(ch, &wg)
go test1(ch, &wg)

go func() {
wg.Wait()
close(ch)
}()

for txt := range ch {
fmt.Println(txt)
}
}

关于GoRoutines,具有 WaitGroup 意外输出的 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31945315/

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