为什么我的线程是MainThread?

时间:2018-08-14 00:42:05

标签: python-3.x multithreading raspberry-pi3

我正在创建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()

我保留一个全局引用,以便可以在使用shutdown()关闭时杀死线程。

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

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

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

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

为什么该线程在MainThread上运行?我在树莓派上有极限吗?

1 个答案:

答案 0 :(得分:1)

让我们看一下创建线程的两个地方,稍作修改以使它们适合一行,并插入空格以使其对齐:

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=())