2010-09-01 2 views
4

У меня есть некоторые темы рыбалки в очередь на работу, что-то вроде этого:Кто останавливает мои темы?

class Worker(Thread): 
    [...] 
    def run(self): 
     while not self.terminated: 
      job = myQueue.get_nowait() 
      job.dosomething() 
      sleep(0.5) 

Теперь self.terminated просто булево значение я использую для выхода из цикла, но это проблема, несколько раз в день они перестают работать без моего вмешательства. Все они, кроме одного: приложение начинается с, скажем, 5 рабочих потоков и в произвольное время я проверяю их, и один работает только. Все остальные имеют как _Thread__initialized, так и _Thread__stopped fields true. Нитки и задания не взаимодействуют друг с другом. Что я должен искать?

PS: Я понимаю, что очень сложно попытаться выяснить проблему без фактического кода, но она огромна.

UPDATE: на самом деле Queue.Empty является единственным исключением в ловушке - думаю, я полагал, что все внутренние ошибки заданий распространяются без уничтожения потоков eheh - поэтому я собираюсь заблокировать все исключения и увидеть ...

+0

Действительно сопротивляясь желанию предложить, чтобы это был Джон Скит .. –

ответ

2

Как пример, исключение внутри цикла остановит поток.

Почему вы используете get_nowait(), а не get()? Что делать, если очередь пуста?

+0

Он не использует ядовитую таблетку, чтобы обозначить, что нити должны умереть - вместо этого он и устанавливает флаг «завершенный» в качестве условия выхода цикла, который требует, чтобы неблокирование попадало на оценку –

+0

Oof, позвольте мне выполнить резервное копирование. Вероятно, вам нужно было использовать дополнительный тайм-аут блокировки get. +1! –

+0

Это была проблема cuncurrency, два потока, пытающихся записать в том же файле, я был глуп, чтобы не ожидать ошибок внутри заданий: P btw благодарю вас и всех остальных за ответы. –

2

stackoverflow? :)

+5

Закрыто как не настоящий ответ. Этот ответ юмористичен, интересен или не воспринимает себя достаточно серьезно. –

+0

Абсолютно, но переполнение стека - очень вероятная причина для того, чтобы нить умереть. Но все поведение приложения зависит от платформы, я не знаю, как Python обращается к завершению фоновых проходов. – Shrike

0

GIL? в одно времени только переводчик делает работу, если вы хотите, правда, распараллеливание вы должны использовать многопроцессорные см http://docs.python.org/library/multiprocessing.html

+0

Мне не нужна истинная распараллеливание, так или иначе, я думаю, что причина GIL заключается в том, чтобы позволить потокам работать, а не убивать их. –

+0

Does Thread_stopped означает, что поток завершен или это означает, что он остановлен по какой-либо причине и вернется? –

3

Если это фактический код это довольно очевидно: myQueue.get_nowait() вызывает исключение (Empty), когда очередь пуста!

1

У меня есть два предложения.

1) get_nowait() создаст исключение Queue.Empty, если нет доступных элементов. Убедитесь, что исключения не убивают ваши потоки.

2) Вместо этого используйте get(). Поместите None в очередь, чтобы вывести поток для вывода вместо булевского флага. Тогда вам не понадобится полсекунды, и вы будете обрабатывать предметы быстрее.

def run(self): 
    while True: 
     job = queue.get() 
     if job: 
      try: 
       job.do_something() 
      except Exception as e: 
       print e 
     else: # exit thread when job is None 
      break 
+0

(не ориентированный ни на кого в частности) в точке 2 - просто имейте в виду, что если есть несколько потребительских потоков для одной очереди, которую производитель должен поставить None для каждого потока.Или вы можете использовать блокировку get с дополнительным тайм-аутом для периодической проверки флага (это также позволит периодическое ведение домашнего хозяйства/сердцебиение) –

Смежные вопросы