Форум сайта python.su
У меня есть нечто вроде следующего кода:
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 "Готово"
Отредактировано (Ноя. 21, 2009 12:55:30)
Офлайн
После выхода из CatParser.run поток завершит работу, никаких del делать не нужно. Насчет подхода, хорошо бы добавить возможность стопануть все потоки, например через Event() в ф-и stop. И заменить цикл c threading.enumerate, на работу с Semaphore. Да и ждать завершения работы потоков лучше через cp.join(timeout).
Офлайн
я не профи..но вот это мне кажется не совсем правильно:
while len(threading.enumerate()) > 10: # типа ограничение на 10 потоков
time.sleep(1)
while len(threading.enumerate()) > 1: # типа ждем, пока завершатся последние потоки
time.sleep(1)
Офлайн
goblin_maksя в нем наблюдал только потоки которые я создал и основной поток. А можете кто-нибудь привести пример с семафорами?
len(threading.enumerate()) всегда больше 1, так как учитывает и сервисные потоки самого интерпретатора.
Отредактировано (Ноя. 23, 2009 15:05:45)
Офлайн
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 "Готово"
Офлайн
Круто, спасибо )
Офлайн