Golang channel 让程序无限期等待

标签 go channel

我正在开发一个具有经理/ worker 风格设置的程序。它有 n 个工作人员从 http 源获取数据,将数据推送到 gameData channel ,从 urlData channel 拉出 url 信息并重复。然后我有一个 goroutine,它应该解析来自 api 的数据,该 api 从 channel gameData 中提取并将 url 推送到 urlData channel 。

我的问题是 goroutine 第二次尝试将某些内容推送到其中一个 channel 时,goroutines 停止了,我不得不终止程序。

这里是一些代码和一个到 repo 的链接:https://github.com/gaigepr/lolTeams

编辑:

在阅读了关于使用缓冲 channel 的评论后,问题显然是一个死锁。但是,使 channel 缓冲只会使死锁发生的时间更长。

此时同步解析器和 getgames 线程是否是确保没有死锁的方法?

编辑2:

我重构了程序,现在我使用线程安全队列来存储 summonerID,并且每个工作线程现在都在自己的数据上调用解析器函数。这很好地简化了事情。我这样做是因为由于数据积累的性质,我无法解决 playerChan 最终填满的问题。除非有人有理由不这样做,否则我会保留这个问题,看看是否有人有解决 channel 问题的答案。

最佳答案

让我提出一些建议,您可以使用 default 大小写,例如

default: 
 continue

这可以帮助您处理没有来自您之前指定的 channel 的传入值的情况,因此您可以简单地继续您的 for 循环,直到 channel 中出现某些东西,或者您可以使用这样的超时情况:

case <-time.After(6 * time.Second):
 continue

当然,这 2 种情况将允许您继续在 channel 中循环,从技术上讲,您不会遇到死锁,除非其他 go-routines 停止通过 channel 发送值。

关于Golang channel 让程序无限期等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24682259/

相关文章:

go - 使用 go-github 打印存储库版本

go - channel 是做什么用的?

Kotlin 协程 : Channel vs Flow

go - 为什么共享 int 变量在 go 例程中递增时显示原子行为?

Golang 工厂方法

go - 如何在Go中使用多个html模板(即具有基本模板或页脚模板)?

go - 使用反射附加到结构中的 slice 字段

performance - 如何判断 go channel 的哪一边正在等待?

rust - 从闭包发送 channel 信号

仅向 channel 发送值时进入工作流程