如何查找哪些已在Python中完成执行

如何查找哪些已在Python中完成执行,python,multithreading,Python,Multithreading,我对线程的概念非常陌生,而且这些概念仍然有些模糊 但到目前为止,我有一个需求,即我从Python程序中启动任意数量的线程,然后我的Python程序应该向运行进程的用户指示哪些线程已经执行完毕。以下是我的第一次尝试: import threading from threading import Thread from time import sleep def exec_thread(n): name = threading.current_thread().getName()

我对线程的概念非常陌生,而且这些概念仍然有些模糊

但到目前为止,我有一个需求,即我从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()
,但我希望找到一个更优雅的解决方案,如果子线程能够以某种方式与主线程通信并说我完成了


非常感谢您提前给出答案。

指示单个线程“完成”的最简单、最直接的方法是在线程的实现方法中添加所需的通知,这是最后一步。例如,您可以向用户打印通知

或者,您可以使用事件,请参见:

这是最简单的通信机制之一 线程:一个线程发出事件信号,其他线程等待它

事件对象管理一个内部标志,该标志可以通过 方法,并使用clear()方法重置为false。这个 wait()方法阻塞,直到标志为true

因此,线程实现中的“最后一步”是设置一个事件对象,而主线程可以等到它被设置好

或者,为了实现更奇特、更高效的机制,请使用队列:


完成后,每个线程向队列写入一个“我完成了”对象,并且主线程可以在每个线程完成时从队列中依次读取这些通知。

我不这么认为的可能重复项。。。我故意没有选择thread.join(),因为这将阻止所有线程完成执行,但用户不能等待那么久。然后指定您的用例——实现将高度取决于您考虑的“通信”类型。是的,我很抱歉。我编辑了问题我可以为每个线程创建一个事件,其中只有主线程在等待它吗?或者我必须让所有线程等待事件发生?很抱歉问了这么天真的问题,但我对这个问题很陌生。