python创建线程详解

python主要通过两种方式来创建线程:

  1. 使用threading模块中的Thread类构造器创建线程。即直接对类threading.Thread进行实例化创建线程,并调用实例化对象的start()方法启动线程。
  2. 继承 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 的方式在执行。
< 进程和线程的详解 线程的生命周期>