Определить завершение работы интерпретатора в потоке демона

Мы пострадали от этой ошибки:

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()

Связанный: http://docs.python.org/2/library/threading.html

Это код из модуля 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:).

Потоки демонов не обязательно плохие, они могут определенно ускорить процесс разработки. Вы просто должны быть осторожны с ними.

Другие вопросы по тегам