为什么我的线程是 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=())
我正在创建 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=())