recursion - 如何在不关闭无缓冲 channel 的情况下发现没有接收到任何东西?

标签 recursion go channel goroutine

有没有办法知道 channel 中的所有值是否已被消耗?我正在制作一个从种子网站递归获取网站的爬虫。我没有关闭 channel ,因为它从服务器消耗并且每次发送新站点时都应该抓取。对于给定的种子站点,除了超时之外,我找不到更好的方法来了解子任务的完成情况。如果有办法知道 channel 中没有任何值(value)(剩下来被消费),我的程序就可以退出子任务并继续监听服务器。

最佳答案

没有“在无缓冲 channel 中排队”这样的事情。如果 channel 是无缓冲的,那么根据定义它总是空的。如果它被缓冲,那么它可能有一定数量的元素到它的大小。但是试图读取其中有多少元素总是会导致竞争条件,所以不要那样设计(在 Go 中也是不可能的)。

理想情况下,避免设计需要知道 child 什么时候完成,但当你必须的时候,给他们一个 channel 来回应你。当他们回应时,您就知道他们已经完成。

您描述的问题类型在 Go 博客和讲座中有很好的介绍:

关于recursion - 如何在不关闭无缓冲 channel 的情况下发现没有接收到任何东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32468762/

相关文章:

c++ - 具有全局定义变量的递归比没有全局定义变量的递归函数获得更多堆栈。为什么? (跳入 C++)

c - 递归循环

无法理解此代码的输出

mongodb - 将 MongoDB $max 结果转换为 golang 数据

java - 如何在 java/xuggler 中混合多个音频 channel ?

go - 如何在不阅读的情况下检查 channel 是否关闭?

go - 无缓冲 channel 上的循环范围

python递归函数错误RuntimeError : maximum recursion depth exceeded

go - 迭代时替换 channel

go - 名称错误 : name 'go' is not defined in sublime text 3 console