gpt4 book ai didi

go - 从 channel 读取时未检测到 "deadlock"

转载 作者:IT王子 更新时间:2023-10-29 00:39:05 25 4
gpt4 key购买 nike

在复杂程序中,从 channel 读取不确定数量任务的执行结果时,出现未检测到的死锁,如何处理?网络服务器?

package main

import (
"fmt"
"math/rand"
"time"
)

func main() {
rand.Seed(time.Now().UTC().UnixNano())

results := make(chan int, 100)

// we can't know how many tasks there will be
for i := 0; i < rand.Intn(1<<8)+1<<8; i++ {
go func(i int) {
time.Sleep(time.Second)
results <- i
}(i)
}

// can't close channel here
// because it is still written in
//close(results)

// something else is going on other threads (think web server)
// therefore a deadlock won't be detected
go func() {
for {
time.Sleep(time.Second)
}
}()

for j := range results {
fmt.Println(j)
// we just stuck in here
}
}

如果程序更简单,请转到 detects a deadlock and properly fails .大多数示例要么获取已知数量的结果,要么按顺序写入 channel 。

最佳答案

诀窍是使用 sync.WaitGroup 并以非阻塞方式等待任务完成。

var wg sync.WaitGroup

// we can't know how many tasks there will be
for i := 0; i < rand.Intn(1<<8)+1<<8; i++ {
wg.Add(1)
go func(i int) {
time.Sleep(time.Second)
results <- i
wg.Done()
}(i)
}

// wait for all tasks to finish in other thread
go func() {
wg.Wait()
close(results)
}()

// execution continues here so you can print results

另请参阅:Go Concurrency Patterns: Pipelines and cancellation - The Go Blog

关于go - 从 channel 读取时未检测到 "deadlock",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38319358/

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