多线程导入模块:
from threading import Thread 或 import threading
注意:一般使用高级线程模块,threading 而不用 Thread 模块,threading 模块中包含 Thread 类
Thread模块:低级模块,不推荐使用,不支持守护线程(daemon)概念
threading模块:高级模块,推荐使用,已对 Thread类 进行封装,支持daemon
Threading 模块属性和方法:
from threading import Thread #导入Threading 高级模块中的 Thread 类
def foo(arg,v): #定义1个执行函数
print(arg,v)
t1=Thread(target=foo,args=('ddd',1,)) #创建1个 Thread 线程实例
t1.start() #执行这个线程
基本属性:
start() 线程准备就绪,等待CPU调度,准备开始执行
getName():获取线程名称
setName('name') : 为线程设置名称
daemon:守护线程(可理解为新建的子线程为后台线程)
如果你设置一个线程为守护线程(当设置t1.setDaemon(True)时),就表示你在说这个线程是不重要的,在进程退出的时候,不用等待这个线程执行玩完后才退出,即前台进程结束后,后台进程也跟着结束了
- isDaemon()
- setDaemon()
是否为守护线程 True( 是守护线程,不重要 ) False (不是守护线程)
用法:t1.setDaemon( True 或False )
默认为False ,等前台(主)线程执行完后才执行,且 放在 t1.start() 前面才有效
守护线程例子:
from threading import Thread #导入Threading 高级模块中的 Thread 类
import time
def foo(arg,v): #定义1个执行函数,需要执行10秒
for i in range(10):
print('守护线程开始执行'+str(i)+'秒')
time.sleep(1)
print('主线程(前台线程)开始') #主线程(前台线程)执行1个动作,打印
t1=Thread(target=foo,args=('ddd',1,)) #实例化1个子线程
t1.setDaemon(True) #设置这个子线程为守护线程(后台线程)
t1.start() #子线程开始工作,执行1个10秒的函数
#print(t1.getName())
print('主线程执行中') #主线程(前台线程)执行1个动作,打印
print('线程结束') #主线程(前台线程)执行1个动作,打印
time.sleep(5) #主线程一共执行了5秒
输出结果:
主线程(前台线程)开始
守护线程开始执行0秒
主线程执行中
线程结束
守护线程开始执行1秒
守护线程开始执行2秒
守护线程开始执行3秒
守护线程开始执行4秒
守护线程开始执行5秒
如上图所示,前台进程执行5秒后,就退出了,虽然守护线程(后台线程)需要执行10秒,但5秒后,也跟着主线程一起退出了。