Python多线程:超详细实例讲解线程的创建
在当今这个追求高效和速度的时代,程序的执行效率显得尤为重要。Python作为一门广泛应用的高级编程语言,为我们提供了多线程编程的能力,让程序能够同时执行多个任务,从而大大提高了执行效率。本文将深入探讨Python中线程创建的相关知识,通过详细的实例为你展示不同的线程创建方式及其应用场景。
线程的基本概念
在深入了解线程创建之前,我们需要先明确线程的基本概念。线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。一个进程可以包含多个线程,每个线程独立执行特定的任务,并且共享进程的资源。与单线程相比,多线程可以实现并发执行,显著提高程序的执行效率。
为了更好地理解线程,我们可以将进程和线程进行对比,它们主要有以下区别:
- 地址空间:线程是进程内的一个执行单元,一个进程至少有一个线程,它们共享进程的地址空间;而进程有自己独立的地址空间。
- 资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源。
- 处理器调度:线程是处理器调度的基本单位,但进程不是。
- 并发执行:进程和线程均可并发执行。
这张图片展示了时间段T内串行、并行、并发的线程情况。串行时线程A、B、C依次进行;并行时线程A、B、C同时进行;并发时线程A、B、C在时间段T内交替进行。能帮助读者更好地理解线程与进程的并发执行区别。
Python中线程创建的模块选择
Python提供了几个用于多线程编程的模块,其中 _thread
和 threading
模块允许程序员创建和管理线程。不过,_thread
是Python 3以前版本中 thread
模块的重命名,此模块仅提供了低级别的、原始的线程支持,以及一个简单的锁,功能比较有限。而 threading
模块是Python 3之后的线程模块,提供了功能丰富的多线程支持,因此在实际开发中推荐使用 threading
模块。
线程创建的不同方式及原理
1. 使用 threading.Thread
类创建线程
这是最直接且常用的方法。你可以创建一个 threading.Thread
的实例,并将要在线程中执行的函数作为 target
参数传递给构造函数。然后,调用该实例的 start()
方法来启动线程。
原理:Thread
类封装了线程的创建和管理逻辑,当调用 start()
方法时,会在新的线程中执行 target
函数。
示例代码:
import threading
import timedef worker(num):print(f'Worker: {num}')time.sleep(2) # 模拟耗时操作print(f'Worker {num} finished')# 创建线程
thread1 = threading.Thread(target=worker, args=(1,))
thread2 = threading.Thread(target=worker, args=(2,))# 启动线程
thread1.start()
thread2.start()# 等待线程完成
thread1.join()
thread2.join()
代码解释:
- 导入模块:
import threading
导入threading
模块,用于多线程编程;import time
导入time
模块,用于模拟耗时操作。 - 定义工作函数:
worker
函数接受一个参数num
,打印线程开始信息,然后暂停2秒,最后打印线程结束信息。 - 创建线程:使用
threading.Thread
类创建线程实例,target
参数指定线程要执行的函数,args
参数是一个元组,包含传递给目标函数的参数。 - 启动线程:调用线程实例的
start()
方法启动线程。 - 等待线程完成:调用线程实例的
join()
方法,主线程会等待该线程执行完毕后再继续执行。
运行结果:当你运行这段代码时,你会看到两个线程同时开始执行,输出类似如下信息:
Worker: 1
Worker: 2
Worker 1 finished
Worker 2 finished
特点、适用场景和优缺点:
- 特点:简单直接,适用于创建少量线程的场景。
- 适用场景:当需要创建的线程数量较少,且逻辑相对简单时,可以使用这种方式。例如,在一个程序中需要同时执行几个独立的小任务。
- 优点:代码简单易懂,易于实现。
- 缺点:如果需要创建大量线程,会频繁地创建和销毁线程,导致系统开销较大。
此流程图展示了用户提交线程后的处理流程。从“用户提交一个线程”开始,首先判断线程是否大于核心线程数,若小于则执行线程,若大于则判断缓存队列是否已满,满了再判断是否小于最大线程数