看了这个问答python多线程无法退出?,发现了一个问题,当队列中的元素数量跟线程数相同时才会退出,如果队列中的元素个数大于线程数,就无法退出了。先问这种情况要怎么办?
请输入代码
import Queue
import threading
def basic_worker(queue):
"""
工作者,当队列中没有任务的时候就执行退出。
"""
while True:
try:
item = queue.get(True,1)
except :
queue.task_done()
break
print('[%s]get %d'%(threading.current_thread(),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.start()
for item in range(8):
queue.put(item)
queue.join() # block until all tasks are done
print 'got here'
if __name__ == '__main__':
basic()
1 回答
![?](http://img1.sycdn.imooc.com/545862370001b03502200220-100-100.jpg)
慕田峪4524236
TA贡献1875条经验 获得超5个赞
If a join() is currently blocking, it will resume when all items have been processed (meaning that a task_done() call was received for every item that had been put() into the queue).
把task_done调用位置改变一下。
import Queue
import threading
def basic_worker(queue):
while True:
try:
item = queue.get(True, 1)
queue.task_done()
print('[%s]get %d' % (threading.current_thread(), item))
except :
break
def basic():
print 'start'
queue = Queue.Queue()
for i in range(4):
t = threading.Thread(target=basic_worker, args=(queue,))
t.start()
for item in range(8):
queue.put(item)
queue.join() # block until all tasks are done
print 'got here'
if __name__ == '__main__':
basic()
添加回答
举报
0/150
提交
取消