Python 高级(三):threading 多线程编程

大家好,我是水滴~~

在Python中,threading模块提供了一种简单而强大的方式来进行多线程编程。多线程可以同时执行多个任务,使程序能够更有效地利用计算资源。本教程将介绍threading模块的基本概念、用法和一些常见的多线程编程模式。

文章中包含大量的示例代码,希望能够帮助新手同学快速入门。

《Python入门核心技术》专栏总目录・点这里

文章目录

  • 前言
  • 一、线程与进程
  • 二、创建并启动线程
    • [2.1 步骤1:导入`threading`模块](#2.1 步骤1:导入threading模块)
    • [2.2 步骤2:定义线程的执行逻辑](#2.2 步骤2:定义线程的执行逻辑)
    • [2.3 步骤3:创建线程对象](#2.3 步骤3:创建线程对象)
    • [2.4 步骤4:启动线程](#2.4 步骤4:启动线程)
    • [2.5 示例代码](#2.5 示例代码)
  • 三、线程的常用方法
    • [3.1 `start()`](#3.1 start())
    • [3.2 `join()`](#3.2 join())
    • [3.3 `is_alive()`](#3.3 is_alive())
    • [3.4 `getName()`](#3.4 getName())
    • [3.5 示例代码](#3.5 示例代码)
  • 四、多线程的应用
  • 总结

前言

多线程(Multithreading)是指在一个程序中同时执行多个线程,每个线程独立执行不同的任务,共享同一进程的资源。多线程可以提高程序的并发性和响应性,特别适用于处理I/O密集型任务和并行计算。

在 Python 中,可以使用 threading 模块来实现多线程编程。通过创建多个线程,每个线程执行不同的任务,可以同时执行多个任务,从而提高程序的效率和性能。

一、线程与进程

在开始讲解threading模块之前,让我们先了解线程与进程的区别。

  • 进程(Process)是操作系统中正在运行的一个程序的实例。每个进程都有自己的地址空间和系统资源,如文件句柄、网络连接等。进程之间相互独立,不能直接共享数据。
  • 线程(Thread)是进程中的一个执行单元。一个进程可以包含多个线程,它们共享进程的地址空间和系统资源。线程之间可以直接访问共享的数据,因此多线程编程更加灵活和高效。

二、创建并启动线程

threading模块提供了创建和管理线程的功能。以下是创建并启动线程的基本步骤:

2.1 步骤1:导入threading模块

python 复制代码
import threading

2.2 步骤2:定义线程的执行逻辑

要创建一个线程,需要定义一个函数作为线程的执行逻辑。

python 复制代码
def my_function(param):
    # 线程的执行逻辑
    pass

2.3 步骤3:创建线程对象

通过threading.Thread类创建线程对象,并将要执行的函数作为参数传递给构造函数。

python 复制代码
my_thread = threading.Thread(target=my_function, args=(param,))
  • target 参数是要在线程中执行的函数名。可以是普通函数、类的方法或匿名函数。
  • args 参数是一个元组,包含了传递给目标函数的参数(如果有的话)。

2.4 步骤4:启动线程

通过调用线程对象的start()方法来启动线程。

python 复制代码
my_thread.start()

线程启动后,它会在后台并发地执行,与主线程(即当前代码的执行线程)同时运行。

2.5 示例代码

下面是一个简单的示例,演示了如何创建并启动一个线程:

python 复制代码
import threading

# 定义一个方法
def greet(name):
    print(f"Hello, {name}")

# 创建一个线程
my_thread = threading.Thread(target=greet, args=('张三',))
# 启动线程
my_thread.start()

运行上述代码,将会在控制台输出"Hello, world!"。

三、线程的常用方法

threading.Thread模块提供了一些常用的方法,用于管理线程的执行和状态。

3.1 start()

启动线程。当调用start()方法时,线程的run()方法将会在一个新的线程中被调用。

python 复制代码
my_thread.start()

3.2 join()

等待线程执行完毕。调用join()方法会阻塞当前线程,直到被调用的线程执行完毕。

python 复制代码
my_thread.join()

3.3 is_alive()

检查线程是否处于活动状态。返回True表示线程正在执行,返回False表示线程已经终止。

python 复制代码
if my_thread.is_alive():
    print("Thread is still running")
else:
    print("Thread has finished")

3.4 getName()

可以使用 setName(name) 方法设置线程的名称,使用 getName() 方法获取线程的名称。例如:

python 复制代码
thread.setName("MyThread")
print(thread.getName())

3.5 示例代码

下面是一个示例,演示了如何使用线程的常用方法:

python 复制代码
import threading
import time

# 创建一个函数
def count_down(num):
    for i in range(num, 0, -1):
        print(i)
        time.sleep(1)

# 创建一个线程
my_thread = threading.Thread(target=count_down, args=(5,))
print("Thread started")
# 启动线程
my_thread.start()

# 等待线程执行完,再继续执行
my_thread.join()
print("Thread finished")

在上述示例中,我们创建了一个倒计时的线程,通过join()方法等待线程执行完毕。输出将会是:

Thread started
5
4
3
2
1
Thread finished

四、多线程的应用

多线程编程可以应用于各种场景,以下是一些常见的多线程编程模式:

  • 并行处理:将一个大任务拆分成多个小任务,并行处理以提高效率。
  • 异步操作:将耗时的操作放在后台线程中进行,避免阻塞主线程,提升用户体验。
  • 定时任务:使用线程定时执行某些任务,如定时备份数据、定时清理临时文件等。

根据具体的需求和场景,选择合适的多线程编程模式。

总结

threading模块提供了一种方便而强大的方式来进行多线程编程。通过创建和管理线程,我们可以实现并行处理、异步操作和定时任务等功能。同时,我们也需要注意线程安全和线程间通信,以确保多线程程序的正确性和可靠性。

希望本教程能够帮助你开始使用threading模块进行多线程编程。祝你编写出高效、可靠的多线程应用!

相关推荐
千澜空几秒前
celery在django项目中实现并发任务和定时任务
python·django·celery·定时任务·异步任务
斯凯利.瑞恩8 分钟前
Python决策树、随机森林、朴素贝叶斯、KNN(K-最近邻居)分类分析银行拉新活动挖掘潜在贷款客户附数据代码
python·决策树·随机森林
yannan2019031329 分钟前
【算法】(Python)动态规划
python·算法·动态规划
蒙娜丽宁39 分钟前
《Python OpenCV从菜鸟到高手》——零基础进阶,开启图像处理与计算机视觉的大门!
python·opencv·计算机视觉
光芒再现dev41 分钟前
已解决,部署GPTSoVITS报错‘AsyncRequest‘ object has no attribute ‘_json_response_data‘
运维·python·gpt·语言模型·自然语言处理
好喜欢吃红柚子1 小时前
万字长文解读空间、通道注意力机制机制和超详细代码逐行分析(SE,CBAM,SGE,CA,ECA,TA)
人工智能·pytorch·python·计算机视觉·cnn
小馒头学python1 小时前
机器学习是什么?AIGC又是什么?机器学习与AIGC未来科技的双引擎
人工智能·python·机器学习
神奇夜光杯1 小时前
Python酷库之旅-第三方库Pandas(202)
开发语言·人工智能·python·excel·pandas·标准库及第三方库·学习与成长
Themberfue1 小时前
Java多线程详解⑤(全程干货!!!)线程安全问题 || 锁 || synchronized
java·开发语言·线程·多线程·synchronized·
千天夜1 小时前
使用UDP协议传输视频流!(分片、缓存)
python·网络协议·udp·视频流