🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 10.2 【并发编程】创建多线程的几种方法 今天的内容会比较基础,主要是为了让新手也能无障碍地阅读,所以还是要再巩固下基础。学完了基础,你们也就能很顺畅地跟着我的思路理解以后的文章。 经过总结,Python创建多线程主要有如下两种方法: - 函数 - 类 接下来,我们就来揭开多线程的神秘面纱。 ## 1. 用函数创建多线程 在Python3中,Python提供了一个内置模块 `threading.Thread`,可以很方便地让我们创建多线程。 `threading.Thread()` 一般接收两个参数: - 线程函数名:要放置线程让其后台执行的函数,由我们自已定义,注意不要加`()`; - 线程函数的参数:线程函数名所需的参数,以元组的形式传入。若不需要参数,可以不指定。 **举个例子** ```python import time from threading import Thread # 自定义线程函数。 def target(name="Python"): for i in range(2): print("hello", name) time.sleep(1) # 创建线程01,不指定参数 thread_01 = Thread(target=target) # 启动线程01 thread_01.start() # 创建线程02,指定参数,注意逗号 thread_02 = Thread(target=target, args=("MING",)) # 启动线程02 thread_02.start() ``` 可以看到输出 ```python hello Python hello MING hello Python hello MING ``` ## 2. 用类创建多线程 相比较函数而言,使用类创建线程,会比较麻烦一点。 首先,我们要自定义一个类,对于这个类有两点要求, - 必须继承 `threading.Thread` 这个父类; - 必须复写 `run` 方法。 这里的 `run` 方法,和我们上面`线程函数`的性质是一样的,可以写我们的业务逻辑程序。在 `start()` 后将会调用。 来看一下例子 为了方便对比,`run`函数我复用上面的`main`。 ```python import time from threading import Thread class MyThread(Thread): def __init__(self, type="Python"): # 注意:super().__init__() 必须写 # 且最好写在第一行 super().__init__() self.type=type def run(self): for i in range(2): print("hello", self.type) time.sleep(1) if __name__ == '__main__': # 创建线程01,不指定参数 thread_01 = MyThread() # 创建线程02,指定参数 thread_02 = MyThread("MING") thread_01.start() thread_02.start() ``` 当然结果也是一样的。 ```python hello Python hello MING hello Python hello MING ``` ## 3. 线程对象的方法 上面介绍了当前 Python 中创建线程两种主要方法。 创建线程是件很容易的事,但要想用好线程,还需要学习线程对象的几个函数。 经过我的总结,大约常用的方法有如下这些: ```python # 如上所述,创建一个线程 t=Thread(target=func) # 启动子线程 t.start() # 阻塞子线程,待子线程结束后,再往下执行 t.join() # 判断线程是否在执行状态,在执行返回True,否则返回False t.is_alive() t.isAlive() # 设置线程是否随主线程退出而退出,默认为False t.daemon = True t.daemon = False # 设置线程名 t.name = "My-Thread" ```