如何查找已在Python中执行完的

时间:2018-08-26 16:33:28

标签: python multithreading

我对线程的概念非常陌生,但是这些概念仍然有些模糊。

但是从现在起,我有一个要求,即从我的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()来检查各个线程是否处于活动状态,但是我希望有一个更优雅的解决方案,在该解决方案中,子线程是否可以与主线程通信并说我完成了!

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

1 个答案:

答案 0 :(得分:0)

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

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

  

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

     

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

因此,线程实现中的“最终操作”将是设置一个事件对象,而主线程可以等待直到它被设置。

或者,为获得更高级,更多的机制,请使用队列:https://docs.python.org/3/library/queue.html

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