我正在创建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上运行?我在树莓派上有极限吗?
答案 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=())