猿问

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()

浮云间
浏览 651回答 1
1回答

慕田峪4524236

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()
随时随地看视频慕课网APP

相关分类

Python
我要回答