Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python线程,我如何等到所有队列都完成后再加入线程?_Python_Multithreading - Fatal编程技术网

使用Python线程,我如何等到所有队列都完成后再加入线程?

使用Python线程,我如何等到所有队列都完成后再加入线程?,python,multithreading,Python,Multithreading,我有两个不同的队列,A和B,由它们自己的线程处理。线程A从internet上提取页面,线程B扫描该页面的所有链接并将其添加到线程A的队列中。正如您所想象的,单个队列可以暂时变空,直到它的伴生线程为它添加更多的任务。但由于任何一个都可以在任何时候暂时清空,我不希望它们在其中一个清空时立即解除阻塞,只有在同一实例中两个都清空时 我怎样才能做到这一点?我的伪代码,真正的交易太混乱了 QueueA QueueB ThreadA: pull page put raw HTML in Qu

我有两个不同的队列,A和B,由它们自己的线程处理。线程A从internet上提取页面,线程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变为空,那么它的所有线程都将死亡并且不会恢复。解决这个问题的合适方法是什么


(我花了无数个小时研究它,除非我错过了一些我找不到的关于这类问题的参考,谢谢你的帮助!)

根本不要停止这两个辅助线程。如果让它们成为后台(守护进程)线程,它们将不会干扰程序的其余部分。由于它们在队列中等待输入时被阻塞,因此它们也不会占用CPU时间。否则,您可以尝试跟踪任何未处理的URL,如果没有剩余URL,则可以终止线程。不过,这需要一些簿记,在线程之间共享,这些线程必须正确同步。感谢您的评论。所以我关心的是,一旦这两个线程完成,我希望它停止。我尝试实现的是第三个队列,它查看q.full()是否正确,如果两者都不正确,那么第三个队列将加入,另外两个队列可以加入。但它似乎不起作用,有什么想法吗@ulricheckhardt您希望这两个线程在无事可做时终止。当所有已启动的任务都完成时,就什么都没有了。因此,将初始URL添加到队列时,任务数将增加到一个。下载该URL后,您将在队列B中创建一个任务,然后才减少已完成任务的数量,使其从一个变为两个,再变回一个。只有当它达到零,你才终止。为了协调两个线程,请使用
threading.Condition
对象。