首页 > 解决方案 > 清理没有 .join() 且不阻塞主线程的线程

问题描述

我的情况是,我有两个端点可以要求一个值,一个可能比另一个快。对端点的调用被阻塞。我想等待一个完成并获得结果,而不是等待另一个完成。

我的解决方案是在单独的线程中发出请求,并让这些线程在完成时将标志设置为 true。在主线程中,我不断检查标志(我知道这是一个忙碌的等待,但这不是我现在主要关心的问题),当一个完成时,它会获取该值并将其作为结果返回。

我遇到的问题是我从不清理其他线程。如果不使用,我找不到任何方法来做到这一点.join(),这只会阻止和破坏整个事情的目的。那么,如何在不从主线程加入的情况下清理阻塞的另一个较慢的线程?

标签: pythonpython-3.xmultithreadingasynchronous

解决方案


你想要的是让你的线程daemons,所以当你得到结果并完成你的主线程时,另一个正在运行的线程将被迫完成。您可以通过将daemon关键字更改为True

tr = threading.Thread(daemon=True)

threading文档:

这个标志的意义在于,当只剩下守护线程时,整个 Python 程序就退出了。

虽然:

守护程序线程在关闭时突然停止。它们的资源(如打开的文件、数据库事务等)可能无法正常释放。如果您希望线程优雅地停止,请将它们设为非守护进程并使用合适的信号机制,例如Event.

我对Events 没有任何特别的经验,因此无法详细说明。随意点击链接并继续阅读。


推荐阅读