说一下我的使用场景:
首先,我有一个列表,放了很多 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 循环中,不会退出(因为没有退出的条件)