python创建线程详解
python主要通过两种方式来创建线程:
- 使用threading模块中的Thread类构造器创建线程。即直接对类threading.Thread进行实例化创建线程,并调用实例化对象的start()方法启动线程。
- 继承 threading 模块中的 Thread 类创建线程类。即用 threading.Thread 派生出一个新的子类,将新建类实例化创建线程,并调用其 start() 方法启动线程。
调用Thread类的构造器创建线程
Thread 类提供了如下的 init() 构造器,可以用来创建线程:
init(self, group=None, target=None, name=None, args=(), kwargs=None, *,daemon=None)
此构造方法中,以上所有参数都是可选参数,即可以使用,也可以忽略。其中各个参数的含义如下:
- group:指定所创建的线程隶属于哪个线程组(此参数尚未实现,无需调用);
- target:指定所创建的线程要调度的目标方法(最常用);
- args:以元组的方式,为 target 指定的方法传递参数;
- kwargs:以字典的方式,为 target 指定的方法传递参数;
- daemon:指定所创建的线程是否为后代线程。
下面程序演示了如何使用 Thread 类的构造方法创建一个线程:
from functools import partial
from threading import Thread
import time
def output(ping):
while True:
print(ping, end='', flush=True)
time.sleep(0.001)
# 偏函数:基于已有的函数,确定其中一个或多个参数来生成新的函数的方法
output1 = partial(output, ping='ping')
output2 = partial(output, ping='pong')
def main(): # 这儿的args内容必须是元组
Thread(target=output, args=('ping',)).start()
Thread(target=output, args=('pong',)).start()
if __name__ == '__main__':
main()
如果程序中不显式创建任何线程,则所有程序的执行,都将由主线程 MainThread 完成,程序就只能按照顺序依次执行。
继承Thread类创建线程类
通过继承 Thread 类,我们可以自定义一个线程类,从而实例化该类对象,获得子线程。
需要注意的是,在创建 Thread 类的子类时,必须重写从父类继承得到的 run() 方法。因为该方法即为要创建的子线程执行的方法,其功能如同第一种创建方法中的 action() 自定义函数。
下面程序,演示了如何通过继承 Thread 类创建并启动一个线程:
import threading
#创建子线程类,继承自 Thread 类
class my_Thread(threading.Thread):
def __init__(self,add):
threading.Thread.__init__(self)
self.add = add
# 重写run()方法
def run(self):
for arc in self.add:
#调用 getName() 方法获取当前执行该程序的线程名
print(threading.current_thread().getName() +" "+ arc)
#定义为 run() 方法传入的参数
my_tuple = ('K', 'W', 'S')
#创建子线程
mythread = my_Thread(my_tuple)
#启动子线程
mythread.start()
#主线程执行此循环
for i in range(5):
print(threading.current_thread().getName())
程序执行结果为:
MainThreadThread-1K
MainThreadThread-1 W
MainThreadThread-1 S
MainThread
MainThread
此程序中,子线程 Thread-1 执行的是 run() 方法中的代码,而 MainThread 执行的是主程序中的代码,它们以快速轮换 CPU 的方式在执行。
< 进程和线程的详解 线程的生命周期>