登录
首页 >  Golang >  Go问答

如何确保所有 goroutine 在没有 time.Sleep 的情况下终止?

来源:stackoverflow

时间:2024-05-01 23:00:23 143浏览 收藏

大家好,我们又见面了啊~本文《如何确保所有 goroutine 在没有 time.Sleep 的情况下终止?》的内容中将会涉及到等等。如果你正在学习Golang相关知识,欢迎关注我,以后会给大家带来更多Golang相关文章,希望我们能一起进步!下面就开始本文的正式内容~

问题内容

我正在尝试用 go 例程来试验谁先收到消息。然而,当主 goroutine 终止时,一些 go 例程仍然存在。我通过 panic 的堆栈跟踪看到了这一点。但是,如果我添加 time.sleep 它们都会终止。我猜这是因为,当主要的 go 例程结束时,go 运行时找不到时间来终止其他例程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package main
 
import (
    "fmt"
    "time"
)
 
func main() {
    for i := 0; i < 1000000; i++ {
        algo()
    }
 
    // without this, some goroutines do not terminate
    // time.Sleep(time.Second)
 
    panic("")
}
 
func algo() {
    c := make(chan int)
    wait := make(chan bool)
 
    go racer(1, wait, c)
    go racer(2, wait, c)
    go racer(3, wait, c)
    go racer(4, wait, c)
    go racer(5, wait, c)
 
    // who gets it first
    c <- 5
    close(wait)
}
 
func racer(name int, wait chan bool, c chan int) {
    select {
    case <-wait:
    case v := <-c:
        fmt.Println(name, ":", v)
    }
}

解决方案


这正是 sync.waitgroup 的用途。以下是取自 this blog post 的玩具示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package main
 
import (
    "fmt"
    "sync"
    "time"
)
 
func main() {
    messages := make(chan int)
    var wg sync.WaitGroup
 
    // you can also add these one at
    // a time if you need to
 
    wg.Add(3)
    go func() {
        defer wg.Done()
        time.Sleep(time.Second * 3)
        messages <- 1
    }()
    go func() {
        defer wg.Done()
        time.Sleep(time.Second * 2)
        messages <- 2
    }()
    go func() {
        defer wg.Done()
        time.Sleep(time.Second * 1)
        messages <- 3
    }()
    go func() {
        for i := range messages {
            fmt.Println(i)
        }
    }()
 
    wg.Wait()
}

今天关于《如何确保所有 goroutine 在没有 time.Sleep 的情况下终止?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>