为了账号安全,请及时绑定邮箱和手机立即绑定

使用 goroutine 时出现死锁

使用 goroutine 时出现死锁

Go
慕无忌1623718 2023-02-14 18:02:14
我有一个程序可以做两件事:读取日志条目并创建logEntry对象处理每个logEntry实例在这里,读取由单独的 goroutine 完成,所有读取条目的处理由单个 goroutine 完成。我正在使用等待组——wg确保在程序退出之前读取所有日志条目,并使用信号通道——done确保日志条目的处理完成。等待组按预期工作,但是当我调用<-done以确保程序仅在处理读取的日志文件后退出时,它会抛出错误fatal error: all goroutines are asleep - deadlock!。有人可以解释为什么会发生这种情况以及如何解决上述错误吗?
查看完整描述

1 回答

?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

在你的情况下,你正在听linesChan,但没有关闭它。当所有数据都通过时,您需要关闭此通道。done <- true不会被执行。


但是这里不需要同步频道,sync.WaitGroup{}就足够了。


package main


import (

    "fmt"

    "sync"

    "time"

)


type logEntry struct {

    lines      []string

    created_at string

    line_count int

}


var wg sync.WaitGroup


func main() {

    linesChan := make(chan (logEntry))


    // Process entries from lines

    go func() {

        for c := range linesChan {

            time.Sleep(100 * time.Millisecond)

            fmt.Printf("%v\n", c)

        }

    }()


    // Read lines

    for i := 1; i <= 10; i++ {

        wg.Add(1)

        go func(i int, linesChan chan (logEntry)) {

            read(i, linesChan)

        }(i, linesChan)

    }


    // Wait till all the files are read

    wg.Wait()

}


func read(count int, channel chan (logEntry)) {

    fmt.Println(count, "read")

    channel <- logEntry{

        line_count: count,

    }

    wg.Done()

}


查看完整回答
反对 回复 2023-02-14
  • 1 回答
  • 0 关注
  • 98 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信