Форум сайта python.su
13
Чем мой не угодил? Давайте разбираться. Попытайтесь понять как работает мой код, задавайте вопросы. Когда поймете - модифицируйте ту часть, которая собственно делает работу, чтобы она делала то, что вам нужно. Вот такой план. Вуаля.
Офлайн
20
Ваши потоки работают в бесконечном цикле и не знают когда им завершить работу. Когда очередь пустеет, то они “повисают” здесь
host = self.queue.get()
# Класс объекта-маркера
class JobDone(object):
pass
...
# После того как в очередь положили все host, создаем
# и кладем число объектов-маркеров по числу потоков
for i in range(60):
queue.put(JobDone())
...
# В коде потока проверяем что мы достали из очереди и если
# это объект-маркер завершения работы, то выходим из цикла
while True:
#grabs host from queue
host = self.queue.get()
if isinstance(host, JobDone):
break
while True:
try:
#grabs host from queue
host = self.queue.get()
if isinstance(host, JobDone):
break
...
except Exception as e:
# При желании записываем сведения об ошибке в лог
finally:
queue.task_done()
Отредактировано (Янв. 12, 2012 09:06:54)
Офлайн
0
Спасибо всем за ответы, но ошибка была куда проще, чем вы думали. Ошибка заключается в том, что я поставил неправильную структуру.
Эд, мне было трудно понять ваш код, было много неясностей, я хотел у вас спросить о них, но потом я нашел сайт где нашел этот пример и хорошее описание.
Было так:
def main():
#spawn a pool of threads, and pass them queue instance
for i in range(60):
t = ThreadUrl(queue)
t.setDaemon(True)
t.start()
#populate queue with data
for host in hosts:
queue.put(host)
#wait on the queue until everything has been processed
queue.join()
def main():
#spawn a pool of threads, and pass them queue instance
for i in range(60):
t = ThreadUrl(queue)
t.setDaemon(True)
t.start()
#populate queue with data
for host in hosts:
queue.put(host)
#wait on the queue until everything has been processed
queue.join()
Офлайн
20
Да, пардон. Не обратил внимания, что это демонические потоки, которые бесконечно работать не будут :)
Офлайн