说一下我的使用场景:
首先,我有一个列表,放了很多 URL,用来测试请求的,然后使用 queue 队列把它们添加到一个队列 q 里面备用(这在生产者消费者模型里面算是原材料吧)
然后,设置一个生产者,它其实也是一个消费者,消费原材料,然后把请求的结果添加到另一个队列 w 中,到这一步我觉得还没有什么问题,因为原材料的数量是一开始就订好了,所以当生产者消费的时候,我判断一下原材料是不是为空就可以退出生产,具体的代码是:
def run(self):
while not self.q.empty():
url = self.q.get()
do something
现在,生产者一直在生产,直到发现原材料为空,就停止了 while 循环
我又有一个消费者,它会消费生产者产生的请求,去解析请求的信息,但是问题来了,如果生产者和消费者同时开启线程的时候,消费者要怎么判断生产者已经没有生产产品了,该退出 while 循环了呢?我的消费者的 run 是这样的:
while True:
if self.w.empty():
pass
else:
info = self.w.get()
do something
很明显,消费者跟生产者不同,它不能去判断当 w 队列为空的时候跳出循环,因为 w 为空有可能只是消费者把当前的产品消费完了,生产者可能还在继续生产,需要等一下而已
所以,现在的问题是,我如果设置多个生产者和消费者线程的话,最后会完成所有的任务,但是消费者线程一直在 while 循环中,不会退出(因为没有退出的条件)
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.