Определить завершение работы интерпретатора в потоке демона
Мы пострадали от этой ошибки:
http://bugs.python.org/issue1856 Segfault потоков демона во время выключения интерпретатора.
Сейчас я ищу способ обойти эту ошибку.
На данный момент код выглядит так:
while True:
do_something()
time.sleep(interval)
Есть ли способ проверить, можно ли по-прежнему использовать интерпретатор перед do_something()?
Или лучше не делать mythread.setDaemon(True) и проверять, вышел ли основной поток?
2 ответа
Ответ на свой вопрос:
Я использую этот шаблон сейчас: не setDaemon(True), не используйте sleep(), используйте parent_thread.join()
while True:
parent_thread.join(interval)
if not parent_thread.is_alive():
break
do_something()
Это код из модуля threading.py:
import sys as _sys
class Thread(_Verbose):
def _bootstrap_inner(self):
# some code
# If sys.stderr is no more (most likely from interpreter
# shutdown) use self._stderr. Otherwise still use sys (as in
# _sys) in case sys.stderr was redefined since the creation of
# self.
if _sys:
_sys.stderr.write("Exception in thread %s:\n%s\n" %
(self.name, _format_exc()))
else:
# some code
может быть полезным Ошибка, которую вы видите, исходит от else
заявление. Итак, в вашем случае:
import sys as _sys
while True:
if not _sys:
break/return/die/whatever
do_something()
time.sleep(interval)
Я не уверен, что это работает, хотя (обратите внимание, что отключение интерпретатора может произойти внутри do_something
так что вы должны, вероятно, обернуть все try:except:
).
Потоки демонов не обязательно плохие, они могут определенно ускорить процесс разработки. Вы просто должны быть осторожны с ними.