我们要创建Thread对象,然后让他们运行,每个Thread对象代表一个线程,在每个线程中我们可以让程序处理不同的任务,这就是多线程编程。
创建Thread对象有两种方法:
1.直接创建Thread,将一个callable对象从类的构造器传递出去,这个callable就是回调函数,用来处理任务。
2.编写一个自定义类继承Thread,然后复写run()方法,在ru()方法中编写任务处理代码,然后创建Thread的子类。
1.直接创建Thread对象
# 导入Python标准库中的Thread模块
from threading import Thread
# 创建一个线程
mthread = threading.Thread(target=function_name, args=(function_parameter1, function_parameterN))
# 启动刚刚创建的线程
mthread .start()
参数说明:
function_name: 需要线程去执行的方法名
args: 线程执行方法接收的参数,该属性是一个元组,如果只有一个参数也需要在末尾加逗号
Thread类定义了以下常用方法与属性:
方法与属性
说明
start()
启动线程,等待CPU调度
run()
线程被cpu调度后自动执行的方法
getName()、setName()
用于获取和设置线程的名称
setDaemon()
设置为后台线程或前台线程(默认是False,前台线程)。如果是后台线程,主线程执行过程中,后台线程也在进行,主线程执行完毕后,后台线程不论成功与否,均停止。如果是前台线程,主线程执行过程中,前台线程也在进行,主线程执行完毕后,等待前台线程执行完成后,程序才停止
ident
获取线程的标识符。线程标识符是一个非零整数,只有在调用了start()方法之后该属性才有效,否则它只返回None
is_alive()
判断线程是否是激活的(alive)。从调用start()方法启动线程,到run()方法执行完毕或遇到未处理异常而中断这段时间内,线程是激活的
isDaemon()方法和daemon属性
是否为守护线程
join([timeout])
调用该方法将会使主调线程堵塞,直到被调用线程运行结束或超时。参数timeout是一个数值类型,表示超时时间,如果未提供该参数,那么主调线程将一直堵塞到被调线程结束
1)创建多线程
Thread的构造方法中,最重要的参数是target,所以我们需要将一个callable对象赋值给它,线程才能正常运行。
如果要让一个Thread对象启动,调用它的start()方法即可。
import threading
import time
def test():
for i in range(5):
print('The {} child thile '.format(i))
time.sleep(1)
thread = threading.Thread(target=test)
thread.start()
# thread.join()
for i in range(5):
print('The {} main thile '.format(i))
time.sleep(1)
上面代码很简单,在主线程上打印 5 次,在一个子线程上打印 5 次。
The 0 child thile The 0 main thile
The 1 child thile The 1 main thile
The 2 child thile
The 2 main thile
The 3 main thile The 3 child thile
The 4 child thile
The 4 main thile
上面的 callable 没有参数,如果需要传递参数的话,args 是固定参数,kwargs 是可变参数。
2)Thread的名字
每一个Thread都有