Ссылается на другие модули в Atexit
Вопрос
У меня есть функция, которая отвечает за убийство ребенка, когда программа заканчивается:
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
).