SeriousCool 发表于 2014-03-18 11:29

Python使用threading和queue实现多线程时如何在queue队列所有任务已经完成时退出程序?

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()

比如python官网上的这段例子

timespace 发表于 2014-03-18 13:29

回复 1# SeriousCool
文档的例子主要是解释Queue的用法,而线程部分,为了简单则是无限循环。
如果要控制线程退出,还要修改代码,起码应该有个标志位控制,在此基础上更接近现实的用法:import queue
import sys
import threading

def worker(name, q, exit_flag):
    while not exit_flag.is_set():
      try:
            # 超时控制,便于及时响应exit_flag
            item = q.get(timeout=3)
      except queue.Empty:
            continue
      print('thread {}, item {}'.format(name, item), file=sys.stderr)
      q.task_done()

def main():
    # 线程退出标志位
    exit_flag = threading.Event()
    exit_flag.clear()

    # 创建共享队列和线程池
    q = queue.Queue()
    num_of_threads = 5
    threads = [threading.Thread(target=worker, args=(str(i+1), q, exit_flag))
               for i in range(num_of_threads)]
    for t in threads:
      t.start()
    for i in range(50):
      q.put(i)
    q.join()

    # 任务处理完成,通知线程退出,并join等待
    exit_flag.set()
    for t in threads:
      t.join()
      
if __name__ == '__main__':
    main()

SeriousCool 发表于 2014-03-19 06:18

timespace 发表于 2014-03-18 13:29 static/image/common/back.gif
回复 1# SeriousCool
文档的例子主要是解释Queue的用法,而线程部分,为了简单则是无限循环。
如果要控制 ...

非常感谢~晚点测试下
页: [1]
查看完整版本: Python使用threading和queue实现多线程时如何在queue队列所有任务已经完成时退出程序?