你能加入 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
的状态。
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
的状态。