Python 发出排队结束的信号?
这里是Python2.7 在中,线程无限期运行:Python 发出排队结束的信号?,python,python-2.7,Python,Python 2.7,这里是Python2.7 在中,线程无限期运行: def worker(): while True: item = q.get() do_work(item) q.task_done() q = Queue() for i in range(num_worker_threads): t = Thread(target=worker) t.daemon = True t.start() for item in
def worker():
while True:
item = q.get()
do_work(item)
q.task_done()
q = Queue()
for i in range(num_worker_threads):
t = Thread(target=worker)
t.daemon = True
t.start()
for item in source():
q.put(item)
q.join() # block until all tasks are done
是否有一种“官方”或推荐的方法来告诉线程在q.join()
之后退出,而不使用全局变量或子类化Thread
目前,我正在做如下工作:
class MyThread(Thread, object):
...
def run(self):
...
while True:
try:
item = self.q.get_nowait()
except Queue.Empty:
if self.is_queue_empty:
break
else:
...
...
threads = [MyThread(q, target) for _ in range(num_threads)]
...
q.join()
for thread in threads:
thread.is_queue_empty = True
它是有效的,但似乎有点粗糙。如果可能的话,我也希望避免列出线程。我不知道最好的“Pythonic”方法是什么,但是数据流通常有某种“魔法字节”或专用值来表示已经到达流的末尾。读取文件时,这可能是EOF
,而从套接字读取时,这可能类似于“套接字关闭”操作系统事件,而其他协议可能会发送要提前读取的字节长度(除了或代替专用值)。queue.join()
是一种障碍。它只是阻塞当前线程,直到每次调用put
时都调用了task\u done
。在我看来,您正在寻找一种方法来取消在某一点之后仍在运行的线程。