Уведомления

Группа в Telegram: @pythonsu

#1 Июль 23, 2008 09:50:06

BION
От:
Зарегистрирован: 2007-08-26
Сообщения: 62
Репутация: +  0  -
Профиль   Отправить e-mail  

Ограничение числа потоков

Пишу поиск по фтп, при нахождении каждой новой директории создается новый поток.
Потоков получается туева хуча => хочу ограничить количество одновременно активных потоков.
т.е.
пишу упроченно чтоб просто схему работы показать

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, но чесн говоря пока не пойму как сюда его приложить.
Как же все таки грамотно ограничить число потокв и построить очередь?
Прошу помощи.



Отредактировано (Июль 23, 2008 10:14:43)

Офлайн

#2 Июль 23, 2008 10:42:17

izekia
От:
Зарегистрирован: 2008-07-19
Сообщения: 317
Репутация: +  12  -
Профиль   Отправить e-mail  

Ограничение числа потоков

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

+ еще создать очередь, в которую помещать папки, которые нужно обработать, для того варианта, который я описал



Отредактировано (Июль 23, 2008 10:43:35)

Офлайн

#3 Июль 23, 2008 12:01:48

crchemist
От:
Зарегистрирован: 2008-07-09
Сообщения: 379
Репутация: +  0  -
Профиль   Отправить e-mail  

Ограничение числа потоков

Офлайн

#4 Июль 23, 2008 13:33:53

cybergrind
От:
Зарегистрирован: 2008-01-21
Сообщения: 201
Репутация: +  0  -
Профиль   Отправить e-mail  

Ограничение числа потоков

тред пул



Офлайн

#5 Июль 23, 2008 18:00:57

BION
От:
Зарегистрирован: 2007-08-26
Сообщения: 62
Репутация: +  0  -
Профиль   Отправить e-mail  

Ограничение числа потоков

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
Ну есть очередь потоков, но как с ними дальше плясать?
Если можно, по подробее.



Отредактировано (Июль 23, 2008 18:03:56)

Офлайн

#6 Июль 25, 2008 05:54:03

izekia
От:
Зарегистрирован: 2008-07-19
Сообщения: 317
Репутация: +  12  -
Профиль   Отправить e-mail  

Ограничение числа потоков

я попробую на выходных пример накидать, просто про потоки в питоне почитать надо



Отредактировано (Июль 25, 2008 05:54:13)

Офлайн

#7 Июль 25, 2008 09:16:50

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Ограничение числа потоков

Эх, молодежь. Почему в голову не приходит запустить гугль, спросить “python thread pool” и поглядеть на ответы?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version