Python 发出排队结束的信号?

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

这里是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 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
。在我看来,您正在寻找一种方法来取消在某一点之后仍在运行的线程。