如何在没有关闭的情况下在无缓冲通道中收到任何内容?

时间:2015-09-08 23:29:44

标签: recursion go channel goroutine

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

1 个答案:

答案 0 :(得分:4)

没有“在无缓冲的频道中排队等”的事情。如果通道是非缓冲的,则根据定义它始终为空。如果它是缓冲的,那么它可能有一些元素,直到它的大小。但是试图读取其中有多少元素总是会导致竞争条件,所以不要那样设计(在Go中也是不可能的)。

理想情况下,避免需要知道儿童何时完成的设计,但必要时,请向他们发送一个回复您的频道。当他们回应时,你知道他们已经完成了。

您所描述的问题在Go博客和会谈中有详细介绍: