Как мне узнать, является ли нить фиктивной нитью в Python? - PullRequest
0 голосов
/ 27 февраля 2019

Мой основной вопрос: как мне определить, является ли текущий поток фиктивным?Я новичок в многопоточности, и недавно я отлаживал некоторый код в своем приложении Apache2 / Flask и подумал, что это может быть полезно.Я получаю ошибку переворачивания, когда запрос был успешно обработан в основном потоке, безуспешно в фиктивном потоке, а затем снова успешно в основном потоке и т. Д.

Как я уже говорил, я использую Apache2 и Flask, которыеКажется, сочетание которых создает эти фиктивные темы.Мне также было бы интересно узнать больше об этом, если кто-нибудь может научить меня.

Мой код предназначен для печати информации о потоках, запущенных в службе, и выглядит примерно так:

def allthr_info(self):
    """Returns info in JSON form of all threads."""
    all_thread_infos = Queue()
    for thread_x in threading.enumerate():
        if thread_x is threading.current_thread() or thread_x is threading.main_thread():
            continue
        info = self._thr_info(thread_x)
        all_thread_infos.put(info)

    return list(all_thread_infos.queue)

def _thr_info(self, thr):
    """Consolidation of the thread info that can be obtained from threading module."""
    thread_info = {}
    try:
        thread_info = {
            'name': thr.getName(),
            'ident': thr.ident,
            'daemon': thr.daemon,
            'is_alive': thr.is_alive(),
        }
    except Exception as e:
        LOGGER.error(e)
    return thread_info

1 Ответ

0 голосов
/ 27 февраля 2019

Вы можете проверить, является ли текущий поток экземпляром threading._DummyThread.

isinstance(threading.current_thread(), threading._DummyThread)

threading.py Сам может научить вас, что такое фиктивные потоки:

Класс фиктивных потоков для представления потоков, не запущенных здесь.Это не мусор, когда они умирают, и их нельзя ждать.Если они вызывают что-либо в threading.py, которое вызывает current_thread (), они оставляют запись в _active dict навсегда после.Их цель - вернуть что-то из current_thread ().Они помечены как потоки демонов, поэтому мы не будем ждать их при выходе (соответствовать предыдущей семантике).

def current_thread():
    """Return the current Thread object, corresponding to the caller's thread of control.

    If the caller's thread of control was not created through the threading
    module, a dummy thread object with limited functionality is returned.

    """
    try:
        return _active[get_ident()]
    except KeyError:
        return _DummyThread()
...