нитки умирают без исключения

У меня проблема с некоторыми из моих рабочих потоков. Я добавил оператор исключения catchall в метод запуска потока следующим образом:

 try:
        """Runs the worker process, which is a state machine"""
        while self._set_exitcode is None :
            assert self._state in Worker.STATES
            state_methodname = "_state_%s" % self._state
            assert hasattr(self, state_methodname)
            state_method = getattr(self, state_methodname)
            self._state = state_method() # execute method for current state

        self._stop_heartbeat()
        sys.exit( self._set_exitcode )
 except:

        self.log.debug(sys.exc_info())

Я читал, что это де-факто способ уловить все, что может вызвать проблему, вместо использования Exception, e. Благодаря этому методу я нашел несколько замечательных маленьких ошибок, но моя проблема в том, что рабочие все еще умирают, и я не знаю, как дальше записывать происходящее или устранять неполадки.

Мы будем очень признательны за любые мысли.

Спасибо!


person deecodameeko    schedule 04.05.2011    source источник
comment
Что вы подразумеваете под «вместо использования Exception»?   -  person Jon Cage    schedule 04.05.2011
comment
@Jon - он имеет в виду вместо того, чтобы специально перехватывать объекты, производные от исключений. С простым исключением вы также будете перехватывать объекты BaseException, не производные от Exception (пример — KeyboardInterrupt). Вы также будете перехватывать исключения, вызванные объектами, не являющимися исключениями (гадость).   -  person Jeremy Brown    schedule 04.05.2011
comment
Ах, достаточно справедливо. Я пропустил , e в конце предложения, когда впервые прочитал его.   -  person Jon Cage    schedule 04.05.2011
comment
С чего ты взял, что тред умирает? Может он просто заблокировался или нормально вышел?   -  person SanityIO    schedule 04.05.2011
comment
Я занял позицию, когда у нас есть ферма рендеринга, в которой все рабочие являются конечными машинами и никогда не должны умирать, а сидеть без дела, ожидая, пока процесс amimn назначит им больше работы. @Турнаев   -  person deecodameeko    schedule 05.05.2011
comment
Значит, они не берут на себя больше работы, когда вы им ее отправляете?   -  person Jon Cage    schedule 05.05.2011
comment
просто следствие работы с кодом прототипа, который все еще содержал ошибки. Закончилось просто перехватом всех исключений и добавлением операторов catch для тех, которые могли вызвать проблемы.   -  person deecodameeko    schedule 10.04.2012


Ответы (2)


Вы можете попробовать изучить трассировку выполнения вашей программы с помощью модуля trace. Например:

% python -m trace -c -t -C ./coverage test_exit.py

Источник:

import sys
import threading

class Worker(object):
    def run(self):
        try:
            sys.exit(1)
        except:
            print sys.exc_info()

threading.Thread(target=Worker().run).start()

Он будет выводить каждую строку по мере выполнения, и вы должны получить отчет о покрытии в каталоге coverage:

...
threading.py(482):         try:
threading.py(483):             if self.__target:
threading.py(484):                 self.__target(*self.__args, **self.__kwargs)
 --- modulename: test_exit, funcname: run
test_exit.py(7):         try:
test_exit.py(8):             sys.exit(1)
test_exit.py(9):         except:
test_exit.py(10):             print sys.exc_info()
(<type 'exceptions.SystemExit'>, SystemExit(1,), <traceback object at 0x7f23098822d8>)
threading.py(488):             del self.__target, self.__args, self.__kwargs
...
person samplebias    schedule 04.05.2011

Что заставляет вас думать, что некоторые потоки завершаются преждевременно? Возможно ли, что они выходят чисто, но ваш метод ведения журнала не является потокобезопасным?

person Jon Cage    schedule 04.05.2011