Вопрос

У меня есть функция, которая отвечает за убийство ребенка, когда программа заканчивается:

class MySingleton:
    def __init__(self):
        import atexit
        atexit.register(self.stop)

    def stop(self):
        os.kill(self.sel_server_pid, signal.SIGTERM)

Однако я получаю сообщение об ошибке, когда эта функция называется:

Traceback (most recent call last):
File "/usr/lib/python2.5/atexit.py", line 24, in _run_exitfuncs
   func(*targs, **kargs)
File "/home/commando/Development/Diploma/streaminatr/stream/selenium_tests.py", line 66, in stop
   os.kill(self.sel_server_pid, signal.SIGTERM)
AttributeError: 'NoneType' object has no attribute 'kill'

Выглядит как то os а также signal модули разгружены раньше atexit называется. Повторно импортируя их решает проблему, но это поведение кажется странным для меня - эти модули импортируются до того, как я зарегистрирую свой обработчик, так почему же они выгружаются до того, как мой собственный выездной обработчик работает?

Это было полезно?

Решение

Нет сильных гарантий по поводу порядка, в котором все разрушаются при времени прекращения программы, так что лучше для обеспечения atexit- Регистрационные функции находятся в себе. Например, в вашем случае:

class MySingleton:
    def __init__(self):
        import atexit
        atexit.register(self.stop)
        self._dokill = os.kill
        self._thesig = signal.SIGTERM

    def stop(self):
        self._dokill(self.sel_server_pid, self._thesig)

Это предпочтительно, чтобы повторно импортировать модули (которые могут привести к снижению прекращения программы и даже бесконечных циклов, хотя этот риск меньше для «поставляемых системных» модулей, таких как os).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top