在Python中检查当前线程是否为主线程
之前已针对Android,ObjectiveC和C++解决了此问题,但显然不适用于Python。如何可靠地确定当前线程是否为主线程?我可以想到一些方法,但没有一种方法能让我真正满意,因为考虑到与threading.MainThread
存在的方法相比,它可能是如此简单。
检查线程名称
主线程是这样实例化的threading.py
:
Thread.__init__(self, name="MainThread")
所以一个人可以做
if threading.current_thread().name == 'MainThread'
但是这个名字是固定的吗?我见过的其他代码检查MainThread
了线程名称中是否包含任何代码。
存储启动线程
我可以在程序启动时即在没有其他线程时存储对启动线程的引用。这绝对是可靠的,但是对于这样一个简单的查询来说太麻烦了吗?
有更简洁的方法吗?
-
问题
threading.current_thread().name == 'MainThread'
在于人们总是可以做到:threading.current_thread().name = 'MyName' assert threading.current_thread().name == 'MainThread' # will fail
也许以下几点更可靠:
threading.current_thread().__class__.__name__ == '_MainThread'
话虽如此,一个人可能仍然会狡猾地做:
threading.current_thread().__class__.__name__ = 'Grrrr' assert threading.current_thread().__class__.__name__ == '_MainThread' # will fail
但是这种选择似乎还是更好。“毕竟,我们都同意这里的成年人。”
更新:
引入了Python 3.4
threading.main_thread()
,它比上面的要好得多:assert threading.current_thread() is threading.main_thread()
更新2:
对于Python <3.4,也许最好的选择是:
isinstance(threading.current_thread(), threading._MainThread)