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

2024-09-26 22:42:49 发布

您现在位置:Python中文网/ 问答频道 /正文

这在之前的AndroidObjective CC++中得到了回答,但显然不是针对Python。如何可靠地确定当前线程是否为主线程?我可以想到一些方法,但没有一种方法真正让我满意,因为如果存在的话,它可能比threading.MainThread更容易。

检查线程名

主线程在threading.py中实例化,如下所示:

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

所以一个人可以

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

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

存储起始线程

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

有没有更简洁的方法来做这件事?


Tags: 实例方法namepyselfifinitcurrent
3条回答

如果像我一样,访问受保护的属性会给您带来Heebie jeebies,那么您可能需要使用threading._MainThread作为suggested的替代方法。在这种情况下,您可能会利用only the Main Thread can handle signals这一事实,因此以下人员可以执行此任务:

import signal
def is_main_thread():
    try:
        # Backup the current signal handler
        back_up = signal.signal(signal.SIGINT, signal.SIG_DFL)
    except ValueError:
        # Only Main Thread can handle signals
        return False
    # Restore signal handler
    signal.signal(signal.SIGINT, back_up)
    return True

更新以解决@user4815162342指出的潜在问题。

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

但这个选项似乎更好;"after all, we're all consenting adults here."

更新:

Python 3.4引入了^{},这比上面的要好得多:

assert threading.current_thread() is threading.main_thread()

更新2:

对于Python<;3.4,最好的选择可能是:

isinstance(threading.current_thread(), threading._MainThread)

这里的答案是旧的和/或坏的,所以这里有一个当前的解决方案:

if threading.current_thread() is threading.main_thread():
    ...

此方法在Python3.4+之后可用。

相关问题 更多 >

    热门问题