python - 如何在 Python 中查找哪些已完成执行
问题描述
我对线程的概念非常陌生,并且这些概念仍然有些模糊。
但是到目前为止,我有一个要求,即我从我的 Python 程序中启动任意数量的线程,然后我的 Python 程序应该向运行该进程的用户指示哪些线程已完成执行。下面是我的第一次尝试:
import threading
from threading import Thread
from time import sleep
def exec_thread(n):
name = threading.current_thread().getName()
filename = name + ".txt"
with open(filename, "w+") as file:
file.write(f"My name is {name} and my main thread is {threading.main_thread()}\n")
sleep(n)
file.write(f"{name} exiting\n")
t1 = Thread(name="First", target=exec_thread, args=(10,))
t2 = Thread(name="Second", target=exec_thread, args=(2,))
t1.start()
t2.start()
while len(threading.enumerate()) > 1:
print(f"Waiting ... !")
sleep(5)
print(f"The threads are done"
所以这基本上告诉我所有线程何时完成执行。
但是我想在我的任何一个线程完成执行后立即知道,以便我可以告诉用户请检查线程的输出文件。
我不能使用 thread.join(),因为这会阻塞我的主程序,除非一切都完成,否则用户将一无所知,这可能需要几个小时。一旦某些结果可用,用户就想知道。
现在我知道我们可以通过做检查单个线程是否处于活动状态:thread.isAlive()
但我希望有一个更优雅的解决方案,如果子线程可以以某种方式与主线程通信并说我完成了!
非常感谢您提前提供任何答案。
解决方案
指示单个线程“完成”的最简单和最直接的方法是将所需的通知放在线程的实现方法中,作为最后一步。例如,您可以向用户打印通知。
或者,您可以使用事件,请参阅: https ://docs.python.org/3/library/threading.html#event-objects
这是线程之间最简单的通信机制之一:一个线程发出事件信号,其他线程等待它。
事件对象管理一个内部标志,可以使用 set() 方法将其设置为 true,并使用 clear() 方法将其重置为 false。wait() 方法阻塞,直到标志为真。
所以,你的线程实现中的“最后一幕”是设置一个事件对象,你的主线程可以等到它被设置。
或者,对于更高级和更多的机制,使用队列: https ://docs.python.org/3/library/queue.html
每个线程在完成后将一个“我完成了”对象写入队列,并且主线程可以在每个线程完成时按顺序从队列中读取这些通知。
推荐阅读
- javascript - 云函数firebase返回值始终为null?
- reactjs - setState 值在反应中没有改变
- javascript - 从 chrome 扩展弹出打开访问网站 localStorage
- c# - 指定角色时 JWT 授权失败
- python - 如何授予 Python 在 AppData 中复制文件的权限
- python - Tweepy 达到速率限制并延迟回复推文
- javascript - 如何在 Vue JS 中有条件地禁用下拉选择
- c++ - 如何快速从文件中读取矩阵?
- android - 如何在颤动中创建带有文本和分隔符的详细信息框
- android - Flutter Gradle 任务 assembleDebug 失败,退出代码为 1