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