首页  >  文章  >  后端开发  >  如何修复 Go 中的“致命错误:所有 goroutine 都在睡眠 - 死锁”?

如何修复 Go 中的“致命错误:所有 goroutine 都在睡眠 - 死锁”?

DDD
DDD原创
2024-11-18 07:41:02697浏览

How to Fix

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn