我有2个不同的队列,A和B,由他们自己的线程处理。线程A从互联网上拉出页面,线程B扫描该页面中的所有链接并将它们添加到线程A的队列中。可以想象,单个队列可以暂时清空,直到它的伴随线程为其添加更多内容。但是,由于其中任何一个都可以随时暂时清空,所以我不希望它们在一个空的时候立即解锁,只有当两个人在同一个实例中变空时。
我怎样才能做到这一点?我的伪代码,真正的交易太乱了
QueueA
QueueB
ThreadA:
pull page
put raw HTML in QueueB
ThreadB:
pull links from raw HTML
add links to QueueA
QueueA.join()
QueueB.join()
我也试过这个,使用QueueC来检查其他队列是否都是空的,它将解除阻塞,以便QueueA和B也能解锁:
QueueA
QueueB
QueueC
ThreadA:
pull page
put raw HTML in QueueB
ThreadB:
pull links from raw HTML
add links to QueueA
ThreadC:
queues = QueueC.get()
while True:
time.sleep(1)
for q in queues:
if q.full():
return
self.parent_queue.task_done()
QueueC.join()
QueueA.join()
QueueB.join()
正如您所看到的,如果QueueA变空,它的所有线程都会死亡并且不会被复活。解决这个问题的恰当方法是什么?
(我花了无数个小时研究它,除非我错过了一些我无法找到这个特定类型问题的参考,谢谢你的帮助!)