首页 > 解决方案 > 如何在 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()但我希望有一个更优雅的解决方案,如果子线程可以以某种方式与主线程通信并说我完成了!

非常感谢您提前提供任何答案。

标签: pythonmultithreading

解决方案


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

或者,您可以使用事件,请参阅: https ://docs.python.org/3/library/threading.html#event-objects

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

事件对象管理一个内部标志,可以使用 set() 方法将其设置为 true,并使用 clear() 方法将其重置为 false。wait() 方法阻塞,直到标志为真。

所以,你的线程实现中的“最后一幕”是设置一个事件对象,你的主线程可以等到它被设置。

或者,对于更高级和更多的机制,使用队列: https ://docs.python.org/3/library/queue.html

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


推荐阅读