在Python中检查当前线程是否为主线程

发布于 2021-01-29 17:52:52

之前已针对Android,ObjectiveC和C++解决了此问题,但显然不适用于Python。如何可靠地确定当前线程是否为主线程?我可以想到一些方法,但没有一种方法能让我真正满意,因为考虑到与threading.MainThread存在的方法相比,它可能是如此简单。

检查线程名称

主线程是这样实例化的threading.py

Thread.__init__(self, name="MainThread")

所以一个人可以做

if threading.current_thread().name == 'MainThread'

但是这个名字是固定的吗?我见过的其他代码检查MainThread了线程名称中是否包含任何代码。

存储启动线程

我可以在程序启动时即在没有其他线程时存储对启动线程的引用。这绝对是可靠的,但是对于这样一个简单的查询来说太麻烦了吗?

有更简洁的方法吗?

关注者
0
被浏览
248
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    问题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)
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看