Python join主线程等待子线程结束

Python join主线程等待子线程结束教程

Python 中,当我们在主线程中开启多个子线程时,如果主线程没有 sleep 或者没有阻塞,那么程序刚运行之后,主线程就会立刻退出。

当主线程退出时,如果我们的子线程是非守护线程,那么此时子线程不受任何影响,而如果我们的子线程是 守护线程,那么此时子线程也会随着主线程的退出而退出。

如果我们期望当子线程没有运行完毕时,主线程不要退出,而是等待子线程运行完毕之后,主线程才退出,这时候,我们就可以使用 join,让主线程等待子线程运行完毕后再退出。

Python threading join函数详解

语法

Thread.join([timeout])

参数

参数 描述
timeout 可选参数,需要等待的时间。

说明

join 函数 接受一个 timeout 可选参数,如果当前线程运行时间未超过 timeout,那么就一直等待线程结束,如果当前线程运行时间已经超过 timeout,那么主线程就不再继续等待。

timeout 参数如果不传递,则是永久等待,直到子线程退出。

案例

主线程等待子线程结束

使用 threading join 函数让主线程等待子线程结束

import threading import time class MyThread(threading.Thread): def __init__(self, name, n): super(MyThread, self).__init__() self.name = name self.n = n def run(self): print("Thread ", self.name, "is running") time.sleep(self.n) print("Thread ", self.name, "exit") def main(): t1 = MyThread("t1", 3) t1.setDaemon(True) t1.start() t2 = MyThread("t2", 2) t2.setDaemon(True) t2.start() if __name__ == "__main__": print("嗨客网(www.haicoder.net)") main()

程序运行后,控制台输出如下:

05 python threading join.png

我们在创建了线程实例之后,使用线程实例的 setDaemon 方法将线程设置为守护线程,此时,我们看到我们的两个守护线程都没有运行完毕,因为主线程退出了,所以守护线程也一起退出了。现在,我们将程序修改如下:

import threading import time class MyThread(threading.Thread): def __init__(self, name, n): super(MyThread, self).__init__() self.name = name self.n = n def run(self): print("Thread ", self.name, "is running") time.sleep(self.n) print("Thread ", self.name, "exit") def main(): t1 = MyThread("t1", 3) t1.setDaemon(True) t1.start() t2 = MyThread("t2", 2) t2.setDaemon(True) t2.start() t1.join() t2.join() if __name__ == "__main__": print("嗨客网(www.haicoder.net)") main()

程序运行后,控制台输出如下:

06 python threading join.png

我们在主线程里面,对两个子线程都使用了 join 函数,即让主线程等待两个子线程的结束,此时,我们看到,两个子线程都运行完毕之后,主线程才退出。

主线程等待子线程结束

使用 threading join 函数传递 timeout 参数

import threading import time class MyThread(threading.Thread): def __init__(self, name, n): super(MyThread, self).__init__() self.name = name self.n = n def run(self): print("Thread ", self.name, "is running") time.sleep(self.n) print("Thread ", self.name, "exit") def main(): t1 = MyThread("t1", 30) t1.setDaemon(True) t1.start() t2 = MyThread("t2", 2) t2.setDaemon(True) t2.start() t1.join(5) t2.join() if __name__ == "__main__": print("嗨客网(www.haicoder.net)") main()

程序运行后,控制台输出如下:

07 python threading join.png

我们将子线程 t1 的等待超时时间设置为了 5 秒,而线程 t2 的等待时间为默认值,即永久等待,此时,我们看到线程 t2 运行完毕了,而线程 t1 未能运行结束,因为线程 t1 的等待超时时间为 5 秒,而线程 t1 运行完毕需要 30 秒。

Python join主线程等待子线程结束教程总结

如果我们期望当子线程没有运行完毕时,主线程不要退出,而是等待子线程运行完毕之后,主线程才退出,这时候,我们就可以使用 join,让主线程等待子线程运行完毕后再退出。 Python threading join 函数语法:

Thread.join([timeout])

join 函数接受一个 timeout 可选参数,如果当前线程运行时间未超过 timeout,那么就一直等待线程结束,如果当前线程运行时间已经超过 timeout,那么主线程就不再继续等待。

timeout 参数如果不传递,则是永久等待,直到子线程退出。