我对线程的概念非常陌生,但是这些概念仍然有些模糊。
但是从现在起,我有一个要求,即从我的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()
来检查各个线程是否处于活动状态,但是我希望有一个更优雅的解决方案,在该解决方案中,子线程是否可以与主线程通信并说我完成了!
非常感谢您提前提供任何答案。
答案 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
每个线程在完成后都会向队列中写入一个“我已经完成”的对象,并且主线程可以在每个线程完成时依次从队列中读取那些通知。