Форум сайта python.su
Пишу поиск по фтп, при нахождении каждой новой директории создается новый поток.
Потоков получается туева хуча => хочу ограничить количество одновременно активных потоков.
т.е.
пишу упроченно чтоб просто схему работы показать
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()
Отредактировано (Июль 23, 2008 10:14:43)
Офлайн
а зачем удалять потоки и создавать, если можно использовать их повторно?
для этого использовать очередь, то есть ждать пока очередь пустая в основном потоке, а поток отработав помещает себя в очередь
и еще один момент, я просто именно на питоне с потоками не работал, но как мне кажется пометки критической секции должны быть,
или переменной с синхронизированным доступом, в твоем случае это threads
+ еще создать очередь, в которую помещать папки, которые нужно обработать, для того варианта, который я описал
Отредактировано (Июль 23, 2008 10:43:35)
Офлайн
Офлайн
тред пул
Офлайн
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)
Офлайн
я попробую на выходных пример накидать, просто про потоки в питоне почитать надо
Отредактировано (Июль 25, 2008 05:54:13)
Офлайн
Эх, молодежь. Почему в голову не приходит запустить гугль, спросить “python thread pool” и поглядеть на ответы?
Офлайн