你能加入 Python 队列而不阻塞吗?

Can you join a Python queue without blocking?

Python 的 Queue 有一个 join() 方法,该方法将阻塞,直到对从队列中取出的所有项目调用 task_done()

有没有办法定期检查这种情况,或者在它发生时接收事件,以便您可以同时继续做其他事情?当然,您可以检查队列是否为空,但这并不能告诉您未完成任务的计数是否实际上为零。

PythonQueue本身不支持这个,你可以试试下面的

from threading import Thread

class QueueChecker(Thread):
    def __init__(self, q):
        Thread.__init__(self)
        self.q = q

    def run(self):
        q.join()

q_manager_thread = QueueChecker(my_q)
q_manager_thread.start()

while q_manager_thread.is_alive():
    #do other things

#when the loop exits the tasks are done
#because the thread will have returned 
#from blocking on the q.join and exited 
#its run method

q_manager_thread.join() #to cleanup the thread

thread.is_alive() 位上的 while 循环可能不是您想要的,但至少您现在可以了解如何异步检查 q.join 的状态。