为什么我的线程是 MainThread?

Why is my thread the MainThread?

我正在创建 5 个线程来处理各种任务,例如从传感器读取 (Raspberry Pi)、TCP 连接和最近录制音频 (pyAudio)。

我在 main() 中以相同方式实例化所有线程,例如:

if __name__ == '__main__':
    main()

def main():
    global network_thread
    network_thread = threading.Thread(name="NET-CONN", target=network_thread_run, args=())
    network_thread.start()

我保留了一个全局引用,因此我可以在关闭时使用 join() 终止线程。

现在,我添加了线程 #5:

global audio_thread
audio_thread = threading.Thread(name="AUDIO", target=audio_thread_run(), args=())
audio_thread.start()

...但我的日志记录表明它在 MainThread 上是 运行。我还仔细检查了 audio_thread_run() 函数内部,它确实是 运行 on MainThread:

if threading.current_thread() is threading.main_thread():
    logger.warning("Audio thread is the same as MainThread!")

为什么这个线程 运行 在 MainThread 上?我是否达到了 Pi 的极限?

让我们看一下您创建线程的两个地方,稍作修改,使它们适合一行,并插入白色-space,使它们排成一行:

net_thread = threading.Thread(name="NET", target=net_run  , args=())
aud_thread = threading.Thread(name="AUD", target=aud_run(), args=())
# Hmmm, what's this suspicious-looking thing here? ---->^^

够有趣 :-) 问题是您实际上是直接从您的主线程 调用 audio_thread_run() 函数,如果它返回,您可能会然后尝试将结果用作启动线程的可调用对象。

如果你真的完全摆脱线程启动的东西,它会归结为更简单的:

audio_thread_run()

这将 非常 运行 从主线程的上下文中运行。

您需要做的是 删除 括号,使其与您在网络线程中遇到的问题相匹配:

audio_thread = threading.Thread(name="AUDIO", target=audio_thread_run, args=())