由于代码第26行设置了daemon=False这个多线程程序无法退出,如果改为daemon=True就没事了。代码可以直接运行
p.s: basic_worker里面我设置了while循环的break条件。
为什么会产生这样的情况呢?
#!/usr/bin/env python # -*- coding: utf-8 -*- import Queue import threading def basic_worker(queue): """ 工作者,当队列中没有任务的时候就执行退出。 """ while True: item = queue.get() if item is None: break print item queue.task_done() def basic(): """ 主线程,队列中总共放了4个任务。 """ print 'start' queue = Queue.Queue() for i in range(4): t = threading.Thread(target=basic_worker, args=(queue,)) t.daemon = False # 这里daemon必须等于True才能程序才能退出 t.start() for item in range(4): queue.put(item) queue.join() # block until all tasks are done print 'got here' if __name__ == '__main__': basic()
面对疾风吧2016-11-09 17:02:18
初步判断这个问题和Queue模块的get()函数有关,该函数的定义是
Queue.get([block[, timeout]])
函数说明如下:
从队列中移除并返回一个数据。如果可选的参数block为真且timeout为空对象(默认的情况,阻塞调用,无超时), 阻塞调用进程直到有数据可用。如果timeout是个正整数,阻塞调用进程最多timeout秒, 如果一直无数据可用,抛出Empty异常(带超时的阻塞调用)。如果block为假, 如果有数据可用返回数据,否则立即抛出Empty异常(非阻塞调用,timeout被忽略)。
如果queue队列为空了,它会一直堵塞进程直到有数据可用,所以退不出程序如果设置queue.get(True, 1),超时后就会抛出异常