为了账号安全,请及时绑定邮箱和手机立即绑定

Python多线程队列元素个数大于线程数量无法退出

Python多线程队列元素个数大于线程数量无法退出

浮云间 2019-02-17 18:45:36
看了这个问答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 回答

?
慕田峪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()
查看完整回答
反对 回复 2019-03-01
  • 1 回答
  • 0 关注
  • 650 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信