Предположим, что я застрял с использованием Python 2.6 и не могу обновить (даже если это поможет). Я написал программу, которая использует класс Queue. Мой производитель - это простой список каталогов. Мои потребительские потоки вытаскивают файл из очереди и делают с ним все. Если файл уже обработан, я пропущу его. Обработанный список генерируется до начала всех потоков, поэтому он не пуст.Использование класса Queue в Python 2.6
Вот несколько псевдокодов.
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 является максимальным) останавливаются, а восьмой поток продолжает обрабатывать один файл за раз. Но, делая это, я теряю всю причину для потоковой передачи приложения.
Я что-то не так, или это ожидаемое поведение классов Queue/threading в Python 2.6?
Должно быть что-то не так - как можно было бы ожидать, что остановка будет зависеть от теста, полностью не связанного с очередью ?!Но я не думаю, что это в этом коде, несмотря на его недостатки (потоки не-демона, злоупотребление встроенным именем 'file', ...) - я не думаю, что это может заставить замолчать потоки! Скорее, как обработано заполнено, и изменено ли оно в части «...» (что может быть проблемой, поскольку вокруг нет блокировки)? Можете ли вы воспроизвести эту проблему с тривиальной популяцией обработанных (например, поместите туда половину файлов) и тривиальным «...», например «print file»? –