Python 高级(三):多线程 threading

在这里插入图片描述

大家好,我是水滴~~

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

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

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

文章目录

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


前言

多线程(Multithreading)是指在一个程序中同时执行多个线程,每个线程独立执行不同的任务,共享同一进程的资源。多线程可以提高程序的并发性和响应性,特别适用于处理I/O密集型任务和并行计算。
在 Python 中,可以使用 threading 模块来实现多线程编程。通过创建多个线程,每个线程执行不同的任务,可以同时执行多个任务,从而提高程序的效率和性能。

一、线程与进程

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

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

二、创建并启动线程

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

2.1 步骤1:导入threading模块

import threading

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

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

def my_function(param):
    # 线程的执行逻辑
    pass

2.3 步骤3:创建线程对象

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

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

2.4 步骤4:启动线程

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

my_thread.start()

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

2.5 示例代码

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

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()方法将会在一个新的线程中被调用。

my_thread.start()

3.2 join()

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

my_thread.join()

3.3 is_alive()

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

if my_thread.is_alive():
    print("Thread is still running")
else:
    print("Thread has finished")

3.4 getName()

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

thread.setName("MyThread")
print(thread.getName())

3.5 示例代码

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

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模块进行多线程编程。祝你编写出高效、可靠的多线程应用!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/272581.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JAVA】黑马MybatisPlus 学习笔记【终】【插件功能】

4.插件功能 MybatisPlus提供了很多的插件功能,进一步拓展其功能。目前已有的插件有: PaginationInnerInterceptor:自动分页TenantLineInnerInterceptor:多租户DynamicTableNameInnerInterceptor:动态表名OptimisticL…

Python 新规范 pyproject.toml 完全解析

多谢:thank Python从PEP 518开始引入的使用pyproject.toml管理项目元数据的方案。 该规范目前已经在很多开源项目中得以支持: Django 这个 Python 生态的顶级项目在 5 个月之前开始使用 pyproject.tomlPytest 这个 Python 生态测试框架的领头羊在 4 个…

HarmonyOS4.0系统性深入开发04UIAbility组件详解(下)

UIAbility组件间交互(设备内) UIAbility是系统调度的最小单元。在设备内的功能模块之间跳转时,会涉及到启动特定的UIAbility,该UIAbility可以是应用内的其他UIAbility,也可以是其他应用的UIAbility(例如启…

java练习题之接口interface练习

1:关于接口和抽象类,下列说法正确的是(ACD) A.抽象类可以有构造方法,接口没有构造方法 B.抽象类可以有属性,接口没有属性 C.抽象类可以有非抽象方法,接口中都是抽象方法 1.8之后 D.抽象类和接…

比亚迪重磅来袭,汽车圈又要大动干戈?

12月15日,我盼望已久的新车————宋L正式登场! 作为一直关注比亚迪的车主,这款新SUV一直处于我的观测范围内。终于在前几日,比亚迪宣布它将于12月15日上市,这对我来说无疑是个好消息。当我了解到宋L将推出后驱和四驱…

【Unity6.0+AI】Unity版的Pytorch之Sentis-把大模型植入Unity

本教程详细讲解什么Sentis。以及恶补一些人工智能神经网络的基础概念,概述了基本流程,加载模型、输入内容到模型、使用GPU让模型推理数据、输出数据。 官方文档 Unity Sentis: Use AI models in Unity Runtime | Unity 主页介绍 官方文档链接:Sentis overview | Sentis | 1…

挑战Python100题(6)

100+ Python challenging programming exercises 6 Question 51 Define a class named American and its subclass NewYorker. Hints: Use class Subclass(ParentClass) to define a subclass. 定义一个名为American的类及其子类NewYorker。 提示:使用class Subclass(Paren…

Scala安装

Scala安装使用 windows安装,配置环境变量 以下载Scala2.11为例,操作在Windows中安装Scala。 官网下载scala2.11:All Available Versions | The Scala Programming Language下载好后安装。双击msi包安装,记住安装的路径。配置环境变量(和配…

YOLOv7训练数据报错

YOLOv7训练数据报错 错误提示1解决方案问题2解决方案成功运行 错误提示1 fatal: not a git repository (or any of the parent directories): .git Traceback (most recent call last):File "/home/ubuntu/code/yolov7-main/utils/google_utils.py", line 26, in att…

一图梳理多模态领域发展简史

本文采用关系图的方式整理了:CLiP、ViLT、FLiP、ALBEF、CoCa、BLiP、VLMo、BEiT 和BEiT v3等近几年来经典的多模态大模型,以及这些工作的相互依托关系。灵感来自:跟李沐读论文系列——多模态串讲 1 模型关系图: ’ 2 各模型的架…

Power BI 学习

数据获取 数据清洗 对导入的数据进行数据整理的过程一般称为「数据清洗」,之所以称之为清洗,是因为在数据分析师眼中,杂乱的数据就是脏数据,只有被清洗成干净的数据后才可以进行分析使用。 数据丰富 操作 1.复制列 点击列名选…

Spring之提前编译:AOT

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需…

讯飞星火认知大模型智能语音交互调用

随着国内外大模型热度的兴起,依托于大模型的智能化,传统的人机交互已经不能满足人们交互的需求。而结合语音和大模型的交互拜托传统互联网获取知识的文字限制,用语音也可以轻松获取想要的知识和思路。 一、大模型智能语音交互调用实现思路 …

k8s集群通过helm部署skywalking

1、安装helm 下载脚本安装 ~# curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 ~# chmod 700 get_helm.sh ~# ./get_helm.sh或者下载包进行安装 ~# wget https://get.helm.sh/helm-canary-linux-amd64.tar.gz ~# mv helm …

智能监测/检测系统EasyCVR国标接入无法播放是什么原因?该如何解决?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

acwing linux docker教程

终章 听着名字还挺伤感的哈哈哈其实是Linux的终章,感谢大家这段时间的阅读,这段使时间我为了给大家清楚的讲解一下Linux自己也是很认真的学习了一遍,自己提升了也不少。其实最近学校里面是讲了Linux和windows server 2019搭载DNS、web、ftp服…

YOLOv5改进 | 主干篇 | ShuffleNetV2轻量化网络助力FPS提高(附代码+修改教程)

一、本文内容 本文给大家带来的改进内容是ShuffleNetV2,这是一种为移动设备设计的高效CNN架构。其在ShuffleNetV1的基础上强调除了FLOPs之外,还应考虑速度、内存访问成本和平台特性。(我在YOLOv5n上修改该主干降低了GFLOPs,但是参数量还是有一定上涨&am…

『JavaScript』全面掌握JavaScript数组的操作、方法与高级技巧

📣读完这篇文章里你能收获到 学习JavaScript中数组的基本操作掌握JavaScript数组的多种内置方法了解JavaScript中的数组扩展运算符、Array.from()和Array.of()等实用技巧熟悉如何在JavaScript中使用数组方法进行数据处理 文章目录 一、基本操作1. 创建数组2. 访问和…

【Spring实战】07 JPA

文章目录 1. 定义2. 出现原因3. 添加依赖4. 使用1)创建 Repository 接口2)自定义查询方法(非必须)3)创建实体类4)调用方法 5. 验证6. 优点7. 缺点8. 详细代码总结 1. 定义 Spring Data JPA 是 Spring 提供…

IP 地址归属地查询

IP 地址归属地查询 1. IP 地址归属地查询2. IP 地址归属地查询References 1. IP 地址归属地查询 https://tool.lu/ip/index.html 2. IP 地址归属地查询 https://www.ip.cn/ip/.html References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/