知行编程网知行编程网  2022-12-05 05:00 知行编程网 隐藏边栏  6 
文章评分 0 次,平均分 0.0
导语: 本文主要介绍了关于Python创建线程的相关知识,包括python类中创建线程,以及Python线程这些编程知识,希望对大家有参考作用。

Python 创建线程

Python 提供了_thread 和threading 两个模块来支持多线程,其中_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指定的函数传递参数。元组的第一个元素被传递给目标函数的第一个参数,元组的第二个元素被传递给目标函数的第二个参数……等等。

kwargs:指定一个字典,以关键字参数的形式将参数传递给target指定的函数。

daemon:指定所构建的线程是否为后代线程。

通过Thread类的构造函数创建和启动多线程的步骤如下:

调用Thread类的构造函数创建线程对象。创建线程对象时,target参数指定的函数将作为线程执行体。

调用线程对象的 start() 方法启动该线程。

下面的程序演示了通过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(100):
    # 调用threading模块current_thread()函数获取当前线程
    print(threading.current_thread().getName() +  " " + str(i))
    if i == 20:
        # 创建并启动第一个线程
        t1 =threading.Thread(target=action,args=(100,))
        t1.start()
        # 创建并启动第二个线程
        t2 =threading.Thread(target=action,args=(100,))
        t2.start()
print('主线程执行完成!')

上面程序中的主程序包含一个循环,当循环变量 i 等于 20 时创建并启动两个新线程:

创建了一个Thread对象,这个线程的目标是action,也就是说会使用action函数作为线程执行体。接下来,程序调用 start() 方法启动 t1 线程。

再次创建一个线程,创建和启动的方式与第一个线程完全相同。

运行上面程序,将会看到如图所示的界面。

Python 创建线程

上面的程序虽然只显式创建并启动了两个线程,但程序实际上有三个线程,即程序显式创建的两个子线程和主线程。前面提到,当一个Python程序开始运行时,程序会创建至少一个主线程,主线程的线程执行体就是程序中的主程序(不放在任何函数中的代码)。

从上图可以看出,此时程序包含三个线程。这三个线程的执行没有先后顺序,它们是并发执行的:Thread-1执行一段时间,然后Thread-2或者MainThread可能会拿到CPU执行一段时间。这是典型的线程并发执行。 CPU以快速轮换的方式在多个线程之间切换,从而给用户一种似乎多个线程同时在执行的错觉。

通过上面的介绍不难看出多线程的含义。如果不使用多线程,主程序直接调用了两次action()函数,那么程序必须等待第一次调用的action()函数执行完成,才能执行第二次。 action() 函数被调用;直到第二次调用的action()函数执行完毕,主程序才会执行。

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写
扫一扫二维码分享