Попробуйте это:
import Queue
import time
def dump_queue(queue):
"""
Empties all pending items in a queue and returns them in a list.
"""
result = []
for i in iter(queue.get, 'STOP'):
result.append(i)
time.sleep(.1)
return result
import multiprocessing
q = multiprocessing.Queue()
for i in range(100):
q.put([range(200) for j in range(100)])
q.put('STOP')
l=dump_queue(q)
print len(l)
В многопроцессорных очередях есть внутренний буфер, который имеет поток фидера, который вытягивает работу из буфера и сбрасывает его в канал. Если бы не все объекты были сброшены, я мог бы увидеть случай, когда Empty поднимается преждевременно. Использование сторожа для указания конца очереди является безопасным (и надежным). Также лучше использовать идиому iter (get, sentinel), чем полагаться на Empty.
Мне не нравится, что он может поднять пустой из-за сбрасывания времени (я добавил time.sleep (.1), чтобы разрешить переключение контекста в поток фидера, он вам может не понадобиться, он работает без него - привычка выпускать GIL).