gpt4 book ai didi

concurrency - 所有 go routines 都睡着了 - 死锁

转载 作者:IT王子 更新时间:2023-10-29 02:17:38 28 4
gpt4 key购买 nike

我正在使用 Go 构建工作系统的框架,但我收到“ fatal error :所有 goroutines 都在 sleep - 死锁!”。

我使用两个 channel 进行协调,一个用于创建工作,第二个用于发送结果。创建作业后,我关闭输入 channel 。

我的问题是如何关闭输出 channel 以便程序可以正确退出。代码是:

package main

import (
"bufio"
"flag"
"fmt"
"log"
"math/rand"
"os"
"time"
)

type Work struct {
id int
ts time.Duration
}

const (
NumWorkers = 5000
NumJobs = 100000
)

func worker(in <-chan *Work, out chan<- *Work) {
for w := range in {
st := time.Now()
time.Sleep(time.Duration(rand.Int63n(int64(200 * time.Millisecond))))
w.ts = time.Since(st)
out <- w
}
}

func main() {
wait := flag.Bool("w", false, "wait for <enter> before starting")
flag.Parse()

if *wait {
fmt.Printf("I'm <%d>, press <enter> to continue", os.Getpid())
reader := bufio.NewReader(os.Stdin)
reader.ReadString('\n')
}

Run()
}

func Run() {
in, out := make(chan *Work, 100), make(chan *Work, 100)
for i := 0; i < NumWorkers; i++ {
go worker(in, out)
}
go createJobs(in)
receiveResults(out)
}

func createJobs(queue chan<- *Work) {
for i := 0; i < NumJobs; i++ {
work := &Work{i, 0}
queue <- work
}
close(queue)
}

func receiveResults(completed <-chan *Work) {
for w := range completed {
log.Printf("job %d completed in %s", w.id, w.ts)
}
}

感谢任何帮助:)

最佳答案

我错过了关于您知道原始答案中死锁原因的部分。

  • 您提到了 WaitGroup,它基本上只是一个信号量
  • 您可以使用另一个“控制” channel ,让工作人员在完成后发送信号

-

func worker(ctrl chan<- bool, in <-chan *Work, out chan<- *Work) {
for w := range in {
st := time.Now()
time.Sleep(time.Duration(rand.Int63n(int64(200 * time.Millisecond))))
w.ts = time.Since(st)
out <- w
}
ctrl <- true
}

func control(ctrl <-chan bool, numWorkers int, out chan<- *Work) {
for i=0; i<numWorkers; i++ {
<-ctrl
}
close(out)
}

原答案:

你在完成时做一个range:

for w := range completed {
log.Printf("job %d completed in %s", w.id, w.ts)
}

但是那个 channel 永远不会关闭

关于concurrency - 所有 go routines 都睡着了 - 死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21444380/

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