如何在python中通知queue.join()停止阻塞,即使当前队列包含未处理的元素?

如何在python中通知queue.join()停止阻塞,即使当前队列包含未处理的元素?,python,multithreading,queue,priority-queue,blocking,Python,Multithreading,Queue,Priority Queue,Blocking,我有一个主线程,该块等待优先级队列(PQ)中的项目被消费者线程处理。使用者线程从不同的填充器线程接收项目。每当使用者线程接收到高优先级的“终止符”项时,它就会终止。但由于主线程正在等待队列元素进行处理,因此它永远不会退出。有没有一种方法可以让我通知PQ.join()返回而不使用while循环清空队列(如果我使用while循环,队列中的大量项目会导致大量延迟)您可以等待消费者线程而不是优先级队列,这似乎是您要等待的事情,即消费者线程.join()而不是PQ.join()是的,谢谢这解决了我的问题。

我有一个主线程,该块等待优先级队列(PQ)中的项目被消费者线程处理。使用者线程从不同的填充器线程接收项目。每当使用者线程接收到高优先级的“终止符”项时,它就会终止。但由于主线程正在等待队列元素进行处理,因此它永远不会退出。有没有一种方法可以让我通知PQ.join()返回而不使用while循环清空队列(如果我使用while循环,队列中的大量项目会导致大量延迟)

您可以等待消费者线程而不是优先级队列,这似乎是您要等待的事情,即
消费者线程.join()
而不是
PQ.join()

是的,谢谢这解决了我的问题。但另一方面,我不明白为什么我的PQ.join()没有取消阻止,即使遇到终止符对象时我使PQ.unfinished_tasks=0。从文档中:
Queue.task_done()表示以前排队的任务已完成。由队列使用者线程使用。对于用于获取任务的每个get(),对task_done()的后续调用会告诉队列任务的处理已完成。如果join()当前处于阻塞状态,则它将在处理完所有项后恢复(这意味着已将()放入队列的每个项都收到了task_done()调用)。如果调用次数超过队列中放置的项目,则引发ValueError。
link:这意味着设置
PQ.unfinished_tasks=0
不会触发
join()
继续,只调用
task_done()
的次数与放置项目的次数相同。