当前位置: 首页 > 面试题库 >

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

常鸿朗
2023-03-14
问题内容

之前已针对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)


 类似资料:
  • 所以一个人可以做 但这个名字固定了吗?我看到的其他代码检查了是否包含在线程名称的任何地方。 我可以在程序启动时存储对起始线程的引用,也就是在没有其他线程的时候。这是绝对可靠的,但对于这样一个简单的查询来说太麻烦了? 有没有更简洁的方法?

  • 如何检查当前线程是否是Linux上的主线程?看起来gettid()只返回一个pid,但linux似乎并不保证main()的线程总是具有一个常量和统一的pid。 这样做的原因是,我正在进行自动并行化,并且我希望确保pthread_create()不会在已经运行在pthread_create()创建的线程上的函数中调用。

  • 我需要检查运行某段代码的线程是否是主(UI)线程。我怎样才能做到这一点呢?

  • 本文向大家介绍如何在C#中检查线程是否为后台线程,包括了如何在C#中检查线程是否为后台线程的使用技巧和注意事项,需要的朋友参考一下 要检查线程是否是后台线程,代码如下: 示例 输出结果 这将产生以下输出- 示例 让我们看另一个例子- 输出结果 这将产生以下输出-

  • 本文向大家介绍Android中检测当前是否为主线程最可靠的解决方法,包括了Android中检测当前是否为主线程最可靠的解决方法的使用技巧和注意事项,需要的朋友参考一下 如果在Android中判断某个线程是否是主线程?对于这个问题,你可能说根据线程的名字,当然这个可以解决问题,但是这样是最可靠的么?万一某天Google一下子将线程的名字改称其他神马东西呢。 方法揭晓 下面的方法是最可靠的解决方案。

  • 问题内容: 有什么方法可以检查给定线程是否正在休眠? 问题答案: 您可以呼叫并检查状态是否为。 请注意,但这并不一定意味着调用的线程也可能正在调用中或其他类似的事件中等待。