Давайте предположим, что я застрял на Python 2.6 и не могу обновить (даже если это поможет). Я написал программу, которая использует класс Queue. Мой продюсер - это простой каталог. Мои потребительские потоки извлекают файл из очереди и делают с ним что-нибудь. Если файл уже обработан, я пропускаю его. Обработанный список генерируется до запуска всех потоков, поэтому он не пустой.
Вот некоторый псевдокод.
import Queue, sys, threading
processed = []
def consumer():
while True:
file = dirlist.get(block=True)
if file in processed:
print "Ignoring %s" % file
else:
# do stuff here
dirlist.task_done()
dirlist = Queue.Queue()
for f in os.listdir("/some/dir"):
dirlist.put(f)
max_threads = 8
for i in range(max_threads):
thr = Thread(target=consumer)
thr.start()
dirlist.join()
Странное поведение, которое я получаю, заключается в том, что если поток встречает файл, который уже был обработан, поток останавливается и ожидает завершения всей программы. Я провел небольшое тестирование, и первые 7 потоков (при условии, что 8 - максимум) останавливаются, а 8-й поток продолжает обрабатывать по одному файлу за раз. Но, делая это, я теряю все основания для создания многопоточности приложения.
Я что-то не так делаю, или это ожидаемое поведение классов Queue / threading в Python 2.6?