我怎么知道线程是否是python中的虚拟线程?

时间:2019-02-27 18:51:22

标签: python multithreading apache2 apache2.4

我的基本问题是:如何检测当前线程是否为虚拟线程?我是线程技术的新手,最近我在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 :(得分:1)

您可以检查当前线程是否为threading._DummyThread的实例。

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

threading.py本身可以教您关于什么是伪线程:

  

虚拟线程类,表示未在此处启动的线程。   它们死后不是垃圾,也不能等待它们。   如果他们在threading.py中调用任何调用current_thread()的内容,则它们   之后,永远在_active字典中保留一个条目。   它们的目的是从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()