对于“对python多线程中的守护线程与join的用法详解”的攻略,我会在以下几个方面进行详细说明:
- 线程和守护线程的概念
- join方法的用法和作用
- 守护线程的用法和作用
- 示例说明
1. 线程和守护线程的概念
线程是指在进程中的执行序列,每个线程都有自己的栈、局部变量等,它们共享全局变量和静态变量等。线程是轻量级的进程,一个进程可以同时执行多个线程,各个线程可以并发执行,提高了程序的运行效率。
守护线程(Daemon Thread)是一种特殊的线程。它与普通线程的唯一区别是,当进程退出时,守护线程会被强制结束,而不像普通线程一样等待执行完毕。通俗来说,如果你有一个守护线程在运行,而主线程却已经结束了,那么这个守护线程也就强制退出了。在Python中,通过设置Thread的daemon属性来设置线程的类别是普通线程还是守护线程。
2. join方法的用法和作用
join()方法是线程Thread类的一个方法。join()方法的作用是等待该线程结束后,再执行主线程后面的代码。举个例子,如果有三个线程A、B、C,它们的执行顺序是A启动-->B启动-->C启动,如果在主线程中调用了C.join()方法,那么主线程会等待C线程执行完毕后再执行后面的代码。
join()方法可以设置超时时间,如果在超时时间内该线程还没有执行完毕,则主线程继续执行后面的代码。
3. 守护线程的用法和作用
守护线程的使用场景在于:如果程序中有一些后台运行的任务,这些任务并不是程序的核心功能,而是一些辅助性质的工作,如果用普通的线程去开,主线程退出时这些线程依然会持续运行,造成资源浪费和无用功。如果用守护线程,当主线程退出时,守护线程也会随之结束。
值得注意的是:守护线程在正常情况下不应该用到共享资源,因为守护线程在主线程退出时会强制结束,如果守护线程在占用共享资源,可能会导致数据损坏。
在Python中,使用setDaemon()方法将线程设置为守护线程。
4. 示例说明
下面通过两个示例,具体展示join()和守护线程的用法:
示例1:join()的用法
import threading
import time
class MyThread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
for i in range(5):
time.sleep(1)
print("子线程执行第" + str(i) + "次")
if __name__ == "__main__":
thread = MyThread()
thread.start()
thread.join()
for i in range(5):
time.sleep(1)
print("主线程执行第" + str(i) + "次")
以上代码中,首先定义了一个MyThread类,类中包含了run()方法作为线程运行的主函数,在run()方法中,程序会执行五次,每次执行前要sleep 1秒钟,然后打印一条消息。
在主程序中,首先创建一个MyThread对象,启动该线程,接着在主线程中调用了join()方法,表明让主线程等待该线程结束后再执行后面的代码。最后主线程也执行五次,每次执行前同样sleep 1秒钟,打印一条消息。运行结果如下:
子线程执行第0次
子线程执行第1次
子线程执行第2次
子线程执行第3次
子线程执行第4次
主线程执行第0次
主线程执行第1次
主线程执行第2次
主线程执行第3次
主线程执行第4次
从结果上看,主线程在等待子线程执行完毕之后,才继续执行后面的代码。
示例2:守护线程的用法
import threading
import time
class MyThread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.daemon = True
def run(self):
while True:
time.sleep(1)
print("守护线程正在后台运行")
if __name__ == "__main__":
thread = MyThread()
thread.start()
for i in range(5):
time.sleep(1)
print("主线程执行第" + str(i) + "次")
以上代码中,定义了一个MyThread类,类的daemon属性被设置为True,也就是将该线程设置为守护线程。在run()方法中,程序会不断循环,每次循环前要sleep 1秒钟,然后打印一条消息。
在主程序中,首先创建一个MyThread对象,启动该线程,接着主线程每次都要sleep 1秒钟,打印一条消息。如此循环五次后,主程序退出,整个程序结束运行。
运行结果如下:
主线程执行第0次
守护线程正在后台运行
主线程执行第1次
守护线程正在后台运行
主线程执行第2次
守护线程正在后台运行
主线程执行第3次
守护线程正在后台运行
主线程执行第4次
可以看到我程序运行期间,守护线程一直在后台运行,主线程退出之后,守护线程也立即结束。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:对python 多线程中的守护线程与join的用法详解 - Python技术站