gpt4 book ai didi

Golang channel 让程序无限期等待

转载 作者:数据小太阳 更新时间:2023-10-29 03:38:19 24 4
gpt4 key购买 nike

我正在开发一个具有经理/ 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com