Go:理解并解决“致命错误:所有 goroutine 都在睡眠 - 死锁”
执行 Go 程序时,遇到错误消息“fatal error: all goroutine are sleep - deadlock” 表示程序的所有 goroutine(轻量级线程)都被阻塞无限期地,导致死锁。
在提供的代码中,由于“file1chan”通道的无缓冲性质而出现此问题。当一个值被发送到一个无缓冲的通道时,如果没有其他 goroutine 准备好接收它,它就会阻塞。在这种情况下,主 Goroutine 向“file1chan”发送值,但没有任何并发 Goroutine 从中接收,从而导致死锁。
解决方案 1:引入并发模式
要解决死锁,请引入一个单独的并发 Goroutine,它从“file1chan”接收值并避免阻塞主 Goroutine。使用 goroutine 方法修改后的代码如下:
func main() { f, _ := os.Open("D:\input1.txt") scanner := bufio.NewScanner(f) file1chan := make(chan string) go func() { for scanner.Scan() { line := scanner.Text() parts := strings.Fields(line) for i := range parts { file1chan <- parts[i] } } close(file1chan) }() print(file1chan) }
解决方案 2:使用缓冲通道
或者,您可以使用缓冲通道来处理固定数量的值而不导致死锁。容量为 1 的缓冲通道足以完成此任务:
func main() { f, _ := os.Open("D:\input1.txt") scanner := bufio.NewScanner(f) file1chan := make(chan string, 1) for scanner.Scan() { line := scanner.Text() parts := strings.Fields(line) for i := range parts { file1chan <- parts[i] } } close(file1chan) print(file1chan) }
使用缓冲通道,即使接收者尚未准备好,发送者也可以继续执行,从而避免死锁。
以上是如何修复 Go 中的“致命错误:所有 goroutine 都在睡眠 - 死锁”?的详细内容。更多信息请关注PHP中文网其他相关文章!