Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 21, 2009 12:53:28

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

Что становится с потоками по их завершении?

У меня есть нечто вроде следующего кода:

class CatParser(threading.Thread):
def run(self):
# что-то долго делает

class Parser(object):
def start(self):
for i in xrange(100): # типа надо спарсить 100 категорий на сайте
cp = CatParser(i)
cp.start()
while len(threading.enumerate()) > 10: # типа ограничение на 10 потоков
time.sleep(1)
while len(threading.enumerate()) > 1: # типа ждем, пока завершатся последние потоки
time.sleep(1)
print "Готово"
Возник вопрос: после того, как очередной CatParser(i) завершит свою работу, он пропадает и из threading.enumerate(), можно ли полагать, что по завершении они удаляются, и у меня не будет висеть в памяти 100 зомби или все-же каждому надо делать del? Если их надо удалять вручную, то как это сделать?

п.с. и вообще, как вы можете оценить данный архитектурный подход?



Отредактировано (Ноя. 21, 2009 12:55:30)

Офлайн

#2 Ноя. 21, 2009 14:00:58

Slava
От:
Зарегистрирован: 2009-11-21
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Что становится с потоками по их завершении?

После выхода из CatParser.run поток завершит работу, никаких del делать не нужно. Насчет подхода, хорошо бы добавить возможность стопануть все потоки, например через Event() в ф-и stop. И заменить цикл c threading.enumerate, на работу с Semaphore. Да и ждать завершения работы потоков лучше через cp.join(timeout).



Офлайн

#3 Ноя. 23, 2009 11:04:26

goblin_maks
От:
Зарегистрирован: 2008-12-10
Сообщения: 110
Репутация: +  0  -
Профиль   Отправить e-mail  

Что становится с потоками по их завершении?

я не профи..но вот это мне кажется не совсем правильно:

            while len(threading.enumerate()) > 10:  # типа ограничение на 10 потоков
time.sleep(1)
while len(threading.enumerate()) > 1: # типа ждем, пока завершатся последние потоки
time.sleep(1)
вроде как threading.enumerate() нельзя использовать для таких целей…правилее создать пулл для потоков, или использовать семафор на 10 позиций…len(threading.enumerate()) всегда больше 1, так как учитывает и сервисные потоки самого интерпретатора.



Офлайн

#4 Ноя. 23, 2009 15:04:36

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

Что становится с потоками по их завершении?

goblin_maks
len(threading.enumerate()) всегда больше 1, так как учитывает и сервисные потоки самого интерпретатора.
я в нем наблюдал только потоки которые я создал и основной поток. А можете кто-нибудь привести пример с семафорами?



Отредактировано (Ноя. 23, 2009 15:05:45)

Офлайн

#5 Ноя. 23, 2009 15:24:49

Slava
От:
Зарегистрирован: 2009-11-21
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Что становится с потоками по их завершении?

C семафором примерно так:

from threading import Semaphore, Event

class CatParser(threading.Thread):
def __init__(self, sem):
super(CatParser, self).__init__()
self._sem = sem

def run(self):
try:
pass
finally:
self._sem.release()

class Parser(object):

def __init__(self):
self._sem = Semaphore(10)
self._stopEvent = Event()

def stop(self):
self._stopEvent.set()
self._sem.release()

def start(self):
threads = []
for i in xrange(100):
self._sem.acquire()
if self._stopEvent.isSet():
break
cp = CatParser(self._sem)
cp.start()
threads.append(cp)
for cp in threads:
cp.join(10)
print "Готово"



Офлайн

#6 Ноя. 23, 2009 15:59:01

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

Что становится с потоками по их завершении?

Круто, спасибо )



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version