gpt4 book ai didi

主作用域结束时不调用 goroutine 的延迟

转载 作者:IT王子 更新时间:2023-10-29 01:18:23 25 4
gpt4 key购买 nike

package main

import(
"fmt"
"time"
)

func main(){
fmt.Println("1")
defer fmt.Println("-1")
go func() {
fmt.Println("2")
defer fmt.Println("-2")
time.Sleep(9 * time.Second)
}()
time.Sleep(1 * time.Second)
fmt.Println("3")
}

产生输出:1 2 3 -1但我本以为 goroutine 的 defer 会被调用来产生:1 2 3 -2 -1

在我的实际代码中,我的 goroutine 在 websocket 上被阻塞了......我想我可以发送一个关闭信号,但我还没有想出如何做一个等待多个对象的事情(如果它实际上可以在 go 中完成)。我目前正在通过将延迟的 -2 提升到主范围来解决我的问题。

是否有一些技巧可以推迟放置我做得不对?

http://play.golang.org/p/qv8UEuF2Rb

最佳答案

(我没有足够的代表发表评论?)

Yes, the issue is with goroutine scheduling and is platform dependent. Use runtime.Gosched at the end of the function with the goroutine to ensure it gets some cputime. Presently on x86_64 linux, the code below will produce "3" but without Gosched it produces "1":

没有。这不是问题所在,只能通过巧合(通过实现细节)来解决。正如在 goroutine's defer not called when main scope ends 中已经暗示的那样.您的代码很活泼,因此您必须显式同步 goroutine。最简单的方法是使用 channel 或 WaitGroup http://golang.org/pkg/sync/#WaitGroup .哪个选项更合适取决于你在做什么。如果你只想等待某个结果,那么让 gorutine 在 channel 上发送它的结果,你只需等待它。如果您只想等待多个 goroutine,请使用 WaitGroup 。

关于主作用域结束时不调用 goroutine 的延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19613931/

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