多线程的创建
# 1.使用 threading 模块中 Thread 类的构造器创建线程。即直接对类 threading.Thread 进行实例化,并调用实例化对象的 start 方法创建线程。 # 2.继承 threading 模块中的 Thread 类创建线程类。即用 threading.Thread 派生出一个新的子类,将新建类实例化,并调用其 start 方法创建线程。 """ 调用 Thread 类的构造器创建线程很简单,直接调用 threading.Thread 类的如下构造器创建线程: __init__(self, group=None, target=None, name=None, args=(), kwargs=None, *,daemon=None) 上面的构造器涉及如下几个参数: 1.group:指定该线程所属的线程组。目前该参数还未实现,因此它只能设为 None。 2.target:指定该线程要调度的目标方法。 3.args:指定一个元组,以位置参数的形式为 target 指定的函数传入参数。元组的第一个元素传给 target 函数的第一个参数,元组的第二个元素传给 target 函数的第二个参数……依此类推。 4.kwargs:指定一个字典,以关键字参数的形式为 target 指定的函数传入参数。 5.daemon:指定所构建的线程是否为后代线程。 """ #下面调用 Thread 类的构造器创建线程 import threading # 定义一个普通的action函数,该函数准备作为线程执行体 def action(max): for i in range(max): # 调用threading模块current_thread()函数获取当前线程 # 线程对象的getName()方法获取当前线程的名字 print(threading.current_thread().getName() + " " + str(i)) # 下面是主程序(也就是主线程的执行体) for i in range(50): # 调用threading模块current_thread()函数获取当前线程 print(threading.current_thread().getName() + " " + str(i))#打印当前的主线程(MainThread) if i == 20: # 创建并启动第一个线程 t1 =threading.Thread(target=action,args=(50,),name='wzy') t1.start() # 创建并启动第二个线程 t2 =threading.Thread(target=action,args=(50,),name='hs') t2.start() print('主线程执行完成!') """ 1.默认情况下,主线程的名字为 MainThread,用户启动的多个线程的名字依次为 Thread-1、Thread-2、Thread-3、...、Thread-n 等。 2.虽然上面程序只显式创建并启动了两个线程,但实际上程序有三个线程,即程序显式创建的两个子线程和主线程。前面己经提到,当 Python 程序开始运行后, 程序至少会创建一个主线程,主线程的线程执行体就是程序中的主程序(没有放在任何函数中的代码) 3.在进行多线程编程时,不要忘记 Python 程序运行时默认的主线程, 主程序部分(没有放在任何函数中的代码)就是主线程的线程执行体。 4.此时程序中共包含三个线程,这三个线程的执行没有先后顺序,它们以并发方式执行: Thread-1 执行一段时间,然后可能 Thread-2 或 MainThread 获得 CPU 执行一段时间, 接下来又换其他线程执行,这就是典型的线程并发执行, CPU 以快速轮换的方式在多个线程之间切换,从而给用户一种错觉,即多个线程似乎同时在执行。 """
#2.通过继承Thread类来创建子线程 """ 通过继承 Thread 类来创建并启动线程的步骤如下: 定义 Thread 类的子类,并重写该类的 run() 方法。 run() 方法的方法体就代表了线程需要完成的任务,因此把 run() 方法称为线程执行体。 创建 Thread 子类的实例,即创建线程对象。 调用线程对象的 start() 方法来启动线程。 """ import threading # 通过继承threading.Thread类来创建线程类 class sThread(threading.Thread): def __init__(self): threading.Thread.__init__(self) self.i = 0 # 重写run()方法作为线程执行体 def run(self): while self.i < 100: # 调用threading模块current_thread()函数获取当前线程 # 线程对象的getName()方法获取当前线程的名字 print(threading.current_thread().getName() + " " + str(self.i)) self.i += 1 # 下面是主程序(也就是主线程的执行体) for i in range(100): # 调用threading模块current_thread()函数获取当前线程 print(threading.current_thread().getName() + " " + str(i)) if i == 20: # 创建并启动第一个线程 s1 = sThread() s1.start() # 创建并启动第二个线程 s2 = sThread() s2.start() print('主线程执行完成!')