Python创建线程

Python 提供了 _thread 和 threading 支持多线程的两个模块,其中 _thread 提供低级、原始的线程支持和简单的锁,正如它的名字所暗示的,一般编程不推荐使用 thread 模块;而 threading 该模块提供多线程支持,具有丰富的功能。
Python 创建线程主要有两种方式:
使用 threading 模块的 Thread 类结构器创建线程。
继承 threading 模块的 Thread 类创建线程类。
调用 Thread 类结构器创建线程
调用 Thread 类构造器创建线程非常简单,直接调用 threading.Thread 以下构造器创建线程类:
__init__(self,group=None,target=None,name=None,args=(),kwargs=None,*,daemon=None)
上述结构涉及以下参数:
group:指定线程所属的线程组。该参数尚未实现,因此只能设置为 None。
target:指定调度该线程的目标方法。
args:以位置参数的形式指定一个元组 target 指定的函数传输参数。元组的第一个元素传输给 target 元组的第二个元素传递给函数的第一个参数 target 函数的第二个参数...依此类推。
kwargs:以关键字参数的形式指定字典 target 指定函数传入参数。
daemon:指定的线程是否为后代线程。
通过 Thread 类结构器创建井启动多线程的步骤如下:
调用 Thread 类结构器创建线程对象。创建线程对象时,target 参数指定的函数将被用作线程执行器。
调用线程对象 start() 该方法启动线程。
下面的程序演示通过了 Thread 创建线程对象的类结构器:
importthreading
#定义一个普通的action函数,该函数准备作为线程执行体
defaction(max):
foriinrange(max):
#调用threading模块current_thread()函数获取当前线程
#getname()方法获取当前线程的名称
print(threading.current_thread().getName()+""+str(i))
#以下是主程序(即主程序的执行体)
foriinrange(100):
#调用threading模块current_thread()函数获取当前线程
print(threading.current_thread().getName()+""+str(i))
ifi==20:
#创建并启动第一线程
t1=threading.Thread(target=action,args=(100,))
t1.start()
#创建并启动第二个线程
t2=threading.Thread(target=action,args=(100,))
t2.start()
print('完成主线程执行!')当循环变量时,上述程序中的主程序包含一个循环 i 等于 20 创建并启动两个新线程:
创建了一个 Thread 对象,线程 target 为 action,这意味着它将会 action 作为线程执行体的函数。接下来,程序调用 start() 启动t1线程的方法。
再创建一个线程,其创建和启动方式与第一个线程完全相同。
在操作上述程序时,您将看到如图所示的界面。

虽然上述程序只创建并启动了两个线程,但实际上有三个线程,即程序显式创建的两个子线程和主线程。我前面提到过,当 Python 程序开始运行后,程序至少会创建一个主线程,主线程的线程执行器是程序中的主程序(没有任何函数中的代码)。
从上图可以看出,此时程序中包含三个线程,这三个线程的执行没有顺序,并发执行:Thread-1 执行一段时间,然后可能 Thread-2 或 MainThread 获得 CPU 执行一段时间,然后更改其他线程执行,这是典型的线程并发执行,CPU 多线程之间的快速轮换切换给用户一种错觉,即多线程似乎同时执行。
通过以上介绍,不难看出多线程的意义。如果不使用多线程,主程序将直接调用两次 action() 函数,然后程序必须等待第一次调用 action() 函数执行完成后,将执行第二次调用 action() 函数;必须等待第二次调用 action() 函数执行完成后,主程序将继续向下执行。
