赞
赏
在 Python 中,当我们在主线程中开启多个子线程时,如果主线程没有 sleep 或者没有阻塞,那么程序刚运行之后,主线程就会立刻退出。
当主线程退出时,如果我们的子线程是非守护线程,那么此时子线程不受任何影响,而如果我们的子线程是 守护线程,那么此时子线程也会随着主线程的退出而退出。
如果我们期望当子线程没有运行完毕时,主线程不要退出,而是等待子线程运行完毕之后,主线程才退出,这时候,我们就可以使用 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()
程序运行后,控制台输出如下:
我们在创建了线程实例之后,使用线程实例的 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()
程序运行后,控制台输出如下:
我们在主线程里面,对两个子线程都使用了 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()
程序运行后,控制台输出如下:
我们将子线程 t1 的等待超时时间设置为了 5 秒,而线程 t2 的等待时间为默认值,即永久等待,此时,我们看到线程 t2 运行完毕了,而线程 t1 未能运行结束,因为线程 t1 的等待超时时间为 5 秒,而线程 t1 运行完毕需要 30 秒。
如果我们期望当子线程没有运行完毕时,主线程不要退出,而是等待子线程运行完毕之后,主线程才退出,这时候,我们就可以使用 join,让主线程等待子线程运行完毕后再退出。 Python threading join 函数语法:
Thread.join([timeout])
join 函数接受一个 timeout 可选参数,如果当前线程运行时间未超过 timeout,那么就一直等待线程结束,如果当前线程运行时间已经超过 timeout,那么主线程就不再继续等待。
timeout 参数如果不传递,则是永久等待,直到子线程退出。