线程对象
先了解一下 Python 守护线程基本概念。
守护线程:当一个线程被标记为守护线程时,Python 程序会在剩下的线程都是守护线程时退出,即等待所有非守护线程运行完毕;守护线程在程序关闭时会突然关闭,可能会导致资源不能被正确释放的的问题,如:已经打开的文档等。
非守护线程:通常我们创建的线程默认就是非守护线程,Python 程序退出时,如果还有非守护线程在运行,程序会等待所有非守护线程运行完毕才会退出。
threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
创建线程对象,参数说明如下所示。
group:通常默认即可,作为日后扩展 ThreadGroup 类实现而保留。
target:用于 run() 方法调用的可调用对象,默认为 None。
name:线程名称,默认是 Thread-N 格式构成的唯一名称,其中 N 是十进制数。
args:用于调用目标函数的参数元组,默认为 ()。
kwargs:用于调用目标函数的关键字参数字典,默认为 {}。
daemon:设置线程是否为守护模式,默认为 None。
看一下线程对象 threading.Thread 的方法和属性。
start():启动线程。
run():线程执行具体功能的方法。
join(timeout=None):当 timeout 为 None 时,会等待至线程结束;当 timeout 不为 None 时,会等待至 timeout 时间结束,单位为秒。
is_alive():判断线程是否存活。
getName():返回线程名。
setName():设置线程名。
isDaemon():判断线程是否为守护线程。
setDaemon():设置线程是否为守护线程。
name:线程名。
ident:线程标识符。
daemon:线程是否为守护线程。
我们可以通过实例化 threading.Thread 来创建线程,也可以使用继承 threading.Thread 的子类来创建。
实例化 threading.Thread
import threading import time def target(sleep): time.sleep(sleep) print('当前线程为:', threading.current_thread().name,' ', 'sleep:', sleep) if __name__ == '__main__': t1 = threading.Thread(name='t1', target=target, args=(1,)) t2 = threading.Thread(name='t2', target=target, args=(2,)) t1.start() t2.start() print('主线程结束')
继承 threading.Thread
import threading import time class MyThread(threading.Thread): def __init__(self, sleep, name): super().__init__() self.sleep = sleep self.name = name def run(self): time.sleep(self.sleep) print('name:' + self.name) if __name__ == '__main__': t1 = MyThread(1, 't1') t2 = MyThread(1, 't2') t1.start() t2.start()