免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 9912 | 回复: 2
打印 上一主题 下一主题

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

论坛徽章:
1
摩羯座
日期:2014-04-06 10:30:51
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-03-18 11:29 |只看该作者 |倒序浏览
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官网上的这段例子

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
2 [报告]
发表于 2014-03-18 13:29 |只看该作者
回复 1# SeriousCool
文档的例子主要是解释Queue的用法,而线程部分,为了简单则是无限循环。
如果要控制线程退出,还要修改代码,起码应该有个标志位控制,在此基础上更接近现实的用法:
  1. import queue
  2. import sys
  3. import threading

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

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

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

  27.     # 任务处理完成,通知线程退出,并join等待
  28.     exit_flag.set()
  29.     for t in threads:
  30.         t.join()
  31.         
  32. if __name__ == '__main__':
  33.     main()
复制代码

论坛徽章:
1
摩羯座
日期:2014-04-06 10:30:51
3 [报告]
发表于 2014-03-19 06:18 |只看该作者
timespace 发表于 2014-03-18 13:29
回复 1# SeriousCool
文档的例子主要是解释Queue的用法,而线程部分,为了简单则是无限循环。
如果要控制 ...


非常感谢~晚点测试下
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP