Найти - Пользователи
Полная версия: Ограничение числа потоков
Начало » Python для экспертов » Ограничение числа потоков
1
BION
Пишу поиск по фтп, при нахождении каждой новой директории создается новый поток.
Потоков получается туева хуча => хочу ограничить количество одновременно активных потоков.
т.е.
пишу упроченно чтоб просто схему работы показать
threads=[]
Parser(Thread):
def run(self):
Parse(self.path)

def Parse(self, path):
#bla bla bla
for itm in ftplist:
if(isdir):
start_new_parser(new_path)
threads.remove(self)

def start_new_parser(path):
# Если число активных потоков больше, то тупо ждем уменьшения
while len(threads)>=5:
time.sleep(5)
pr=Parser(path)
threads.append(pr)
pr.start()
pr.join()

pr=Parser(path)
pr.start()
pr.join()
В конец уже запутался, объекты из листа удаляются, но в какой-то момент все замирает, удаление из листа прекращается и всё впадает в анобиоз, т.е. в бесконечный цикл, + ещё периодически кучей вываливаются эксепшан “can't create thread”.
Есть ещё модуль Queue, но чесн говоря пока не пойму как сюда его приложить.
Как же все таки грамотно ограничить число потокв и построить очередь?
Прошу помощи.
izekia
а зачем удалять потоки и создавать, если можно использовать их повторно?
для этого использовать очередь, то есть ждать пока очередь пустая в основном потоке, а поток отработав помещает себя в очередь
и еще один момент, я просто именно на питоне с потоками не работал, но как мне кажется пометки критической секции должны быть,
или переменной с синхронизированным доступом, в твоем случае это threads

+ еще создать очередь, в которую помещать папки, которые нужно обработать, для того варианта, который я описал
cybergrind
тред пул
BION
izekia
а зачем удалять потоки и создавать, если можно использовать их повторно?
для этого использовать очередь, то есть ждать пока очередь пустая в основном потоке, а поток отработав помещает себя в очередь
и еще один момент, я просто именно на питоне с потоками не работал, но как мне кажется пометки критической секции должны быть,
или переменной с синхронизированным доступом, в твоем случае это threads

+ еще создать очередь, в которую помещать папки, которые нужно обработать, для того варианта, который я описал
Спасибо.
Сделал так:
threads = Queue.Queue()
item = Queue.Queue()

Parser(Thread):
def run(self):
while not item.empty():
self.Parse()
#... очередь пуста - поток умирает

def Parse(self):
# bla bla bla
# Читаем следующий путь из очереди
path = item.get()
for itm in ftplist:
if(isdir):
# Добавляем новы путь в очередь
item.put(new_path)

max_active_threads = 5
for x in xrange(max_active_threads):
pr=Parser(x)
pr.start()
pr.join()
threads.put(pr)
С очередью путей работает только первый поток. Как бфть с остальными? Симафоры тыкал везде, где только можно =(
Я не совсем понял вот про это:
izekia
… для этого использовать очередь, то есть ждать пока очередь пустая в основном потоке, а поток отработав помещает себя в очередь
… как мне кажется пометки критической секции должны быть,
или переменной с синхронизированным доступом, в твоем случае это threads
Ну есть очередь потоков, но как с ними дальше плясать?
Если можно, по подробее.
izekia
я попробую на выходных пример накидать, просто про потоки в питоне почитать надо
Андрей Светлов
Эх, молодежь. Почему в голову не приходит запустить гугль, спросить “python thread pool” и поглядеть на ответы?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB