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

看了这个问答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()

阅读 2.1k
1 个回答

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()
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏