在流程的一部分中,我创建了一个缓冲通道。在 doWork 函数内部,有时需要再次执行自身。然而,下面的代码会导致“所有 goroutine 都在睡觉 - 死锁!”错误,我很难理解为什么会发生这种情况。
如何正确实现这里的并发,以及导致死锁问题的原因是什么?
提前致谢!
package main
import (
"errors"
"fmt"
"log/slog"
"runtime/debug"
"time"
)
func main() {
signal := make(chan bool, 2)
go func() {
slog.Default().Info("worker started")
for s := range signal {
if s {
doWork(signal)
}
}
slog.Default().Info("worker stopped")
}()
for {
scan(signal)
}
}
func doWork(signal chan bool) {
fmt.Println("work started")
signal <- true
time.Sleep(2 * time.Second)
fmt.Println("work finished")
}
doWork 中的通道阻塞:当 doWork 运行时,它会尝试用 signal 发送一个真值到信号通道 <- true. This blocks if there is no available space in the channel buffer. This will cause the gorouting to block and cause the deadlock.