当前位置: 首页 > news >正文

python基础语法14-多线程与多进程

Python 多线程与多进程详解

在 Python 中,多线程多进程是常用的并发编程技术,它们可以帮助程序在处理大量任务时提高效率。Python 提供了多个模块来支持多线程和多进程的开发,包括 threadingmultiprocessingasyncio。本文将详细介绍这些模块的基本用法和它们的应用场景。


1. 多线程:threading 模块

多线程(Multithreading)是一种轻量级的并发机制,允许程序同时执行多个任务。Python 中的 threading 模块提供了用于创建和管理线程的功能。多线程适合于 I/O 密集型任务,比如文件读取、网络请求等。

1.1 创建线程

我们可以通过 threading.Thread 类创建新线程,并使用 start() 启动线程,使用 join() 等待线程结束。

import threading
import timedef print_numbers():for i in range(5):time.sleep(1)print(i)# 创建线程
thread = threading.Thread(target=print_numbers)
# 启动线程
thread.start()
# 等待线程结束
thread.join()print("Thread has finished.")

输出:

0
1
2
3
4
Thread has finished.

1.2 线程同步与锁

在多线程环境下,多个线程可能会访问共享资源。为了避免数据竞争和不一致性,可以使用锁(Lock)来保证同一时刻只有一个线程可以访问共享资源。

import threadinglock = threading.Lock()def safe_print():with lock:for i in range(5):print(i)threads = [threading.Thread(target=safe_print) for _ in range(2)]for t in threads:t.start()for t in threads:t.join()

1.3 GIL(全局解释器锁)

需要注意的是,Python 中的多线程并不适合 CPU 密集型任务,这是因为 Python 有全局解释器锁(GIL)。GIL 确保同一时刻只有一个线程执行 Python 字节码,从而限制了多线程的并行执行能力。在进行 CPU 密集型计算时,使用多进程比多线程更有效。


2. 多进程:multiprocessing 模块

多进程(Multiprocessing)是指通过创建多个进程来执行任务,每个进程拥有独立的内存空间,适用于 CPU 密集型任务,如大数据处理、图像处理等。Python 中的 multiprocessing 模块提供了创建和管理进程的功能。

2.1 创建进程

与多线程类似,我们可以通过 multiprocessing.Process 类来创建新进程。

import multiprocessing
import timedef print_numbers():for i in range(5):time.sleep(1)print(i)# 创建进程
process = multiprocessing.Process(target=print_numbers)
# 启动进程
process.start()
# 等待进程结束
process.join()print("Process has finished.")

输出:

0
1
2
3
4
Process has finished.

2.2 进程间通信

在多进程程序中,进程之间无法共享内存。multiprocessing 模块提供了队列(Queue)和管道(Pipe)来实现进程间通信。

import multiprocessingdef worker(q):q.put("Hello from the child process")# 创建队列
queue = multiprocessing.Queue()
# 创建子进程
process = multiprocessing.Process(target=worker, args=(queue,))
process.start()
process.join()# 获取子进程的结果
print(queue.get())  # 输出: Hello from the child process

2.3 共享内存

multiprocessing 模块也提供了共享内存功能,允许多个进程共享数据。可以使用 ValueArray 来实现共享内存。

import multiprocessingdef increment(shared_value):shared_value.value += 1# 创建共享内存
shared_value = multiprocessing.Value('i', 0)# 创建多个进程
processes = [multiprocessing.Process(target=increment, args=(shared_value,)) for _ in range(5)]for p in processes:p.start()for p in processes:p.join()print(shared_value.value)  # 输出: 5

3. 异步编程:asyncio 模块

asyncio 是 Python 中的异步编程模块,适用于 I/O 密集型任务,特别是网络编程、数据库访问等场景。asyncio 通过事件循环(event loop)来调度任务,使得程序在执行 I/O 操作时不会阻塞,能够同时处理多个任务。

3.1 基本语法

asyncio 通过 asyncawait 关键字定义异步函数和调用异步任务。

import asyncioasync def print_numbers():for i in range(5):await asyncio.sleep(1)print(i)# 创建事件循环并运行异步函数
asyncio.run(print_numbers())

输出:

0
1
2
3
4

3.2 并发执行多个任务

asyncio 允许我们同时运行多个异步任务。通过 asyncio.gather(),可以并发地执行多个异步任务。

async def task1():await asyncio.sleep(1)print("Task 1 finished")async def task2():await asyncio.sleep(2)print("Task 2 finished")async def task3():await asyncio.sleep(3)print("Task 3 finished")# 并发执行多个任务
async def main():await asyncio.gather(task1(), task2(), task3())asyncio.run(main())

输出:

Task 1 finished
Task 2 finished
Task 3 finished

3.3 异常处理

在异步编程中,异常也可以通过 try-except 语句捕获和处理。

async def task():try:await asyncio.sleep(1)raise ValueError("Something went wrong")except ValueError as e:print(f"Caught exception: {e}")asyncio.run(task())

输出:

Caught exception: Something went wrong

4. 多线程 vs 多进程 vs 异步

特性多线程 (threading)多进程 (multiprocessing)异步编程 (asyncio)
使用场景I/O 密集型任务CPU 密集型任务I/O 密集型任务
并行性受限于 GIL(Python Global Interpreter Lock)真正的并行性(每个进程有独立的内存空间)通过事件循环调度任务,不是并行
内存消耗共享内存,轻量每个进程都有独立内存不占用额外内存,任务共享事件循环
适用情况网络请求、文件操作等 I/O 操作大规模数据处理,计算密集型任务网络编程、数据库访问等 I/O 操作

5. 总结

  • 多线程适合 I/O 密集型任务,但受到 Python GIL 的限制,不适用于 CPU 密集型任务。
  • 多进程适合 CPU 密集型任务,能够充分利用多核 CPU,但需要更多的内存和进程间通信机制。
  • 异步编程通过 asyncio 模块能够高效地处理大量的 I/O 操作,尤其适用于需要并发执行多个任务的场景。

通过选择合适的并发编程方式,可以有效提高程序的性能,特别是在处理大量任务时。

相关文章:

python基础语法14-多线程与多进程

Python 多线程与多进程详解 在 Python 中,多线程和多进程是常用的并发编程技术,它们可以帮助程序在处理大量任务时提高效率。Python 提供了多个模块来支持多线程和多进程的开发,包括 threading、multiprocessing 和 asyncio。本文将详细介绍…...

深入解析策略模式在C#中的应用与实现

策略模式(Strategy Pattern)是一种行为型设计模式,它通过将一系列算法封装成不同的策略类,使得算法的选择和使用可以在运行时动态改变,且算法的变化对使用者透明。这种模式可以显著减少程序中的条件判断(如…...

ios按键精灵脚本开发游戏辅助工具的代码逻辑

iOS 按键精灵使用 MQ 语言开发游戏脚本,其代码逻辑围绕游戏内的各种操作展开。我将从常见的游戏操作,如点击、移动等方面, 点击操作逻辑​ 在游戏中,点击操作是最基础的交互方式之一。比如要实现点击游戏界面上某个固定位置的 “…...

Pycharm(十三)容器类型的公共运算符和公共方法

一、容器类型的公共运算符 这些运算符是可以作用到 容器类型 中的。 常见的如下: :拼接,适用于字符串、列表、元组; *:复制,适用于字符串、列表、元组; in:是否包含,适用于字符串、列表、元…...

Backtrader从0到1——第一个回测策略

Backtrader从0到1——第一个回测策略 0. 前言1. lines && index2. 生成大脑3. 设置起始资金和佣金4. 添加数据(重点)5. 第一个策略——双均线5.1 策略类5.2 策略参数5.3 添加指标5.4 买卖与订单order5.5 完整策略代码 0. 前言 本人翻阅了大量资料…...

GPT - 因果掩码(Causal Mask)

本节代码定义了一个函数 causal_mask,用于生成因果掩码(Causal Mask)。因果掩码通常用于自注意力机制中,以确保模型在解码时只能看到当前及之前的位置,而不能看到未来的信息。这种掩码在自然语言处理任务(如…...

lombok的坑

我使用lombok的Data注解带来的坑。 代码如下: 公共类: package com.tyler.oshi.common;import lombok.Data; import lombok.NoArgsConstructor;/*** author: TylerZhong* description:*/Data NoArgsConstructor public class R {private int code;priv…...

基于Python的网络爬虫技术研究

基于Python的网络爬虫技术研究 以下从多个方面为你介绍基于 Python 的网络爬虫技术: 概述 网络爬虫是一种自动获取网页内容的程序,在 Python 中可以借助诸多强大的库和工具实现。网络爬虫能应用于数据采集、搜索引擎、舆情监测等众多领域。 核心库 …...

微信小程序跳6

//金额格式化 rmoney: function(money) { return parseFloat(money).toFixed(2).toString().split().reverse().join().replace(/(\d{3})/g, $1,) .replace( /\,$/, ).split().reverse().join(); }, daysUntil: function(milliseconds) { const endDate new Date(milliseconds…...

项目1笔记

Data Data 是一个常用的 Lombok 注解,主要用于 Java 类中,可以自动生成以下内容: Getter(所有字段) Setter(所有非 final 字段) toString() 方法 equals() 和 hashCode() 方法 无参构造函…...

分享:批量识别图片文字并重命名,根据图片文字内容对图片批量重命名,Python和Tesseract OCR的完成方案

一、项目背景 在日常工作中,处理大量图片文件时,常常需要从图片中提取文字信息,并根据提取的文字对图片进行重命名。传统的手动操作方式效率低下且容易出错。通过OCR(光学字符识别)技术,可以自动从图片中提取文字信息,并基于提取的文字对图片进行批量重命名。 Tesserac…...

【安全】加密算法原理与实战

为了理解SSL/TLS原理,大家需要掌握一些加密算法的基础知识。当然,这不是为了让大家成为密码学专家,所以只需对基础的加密算法有一些了解即可。基础的加密算法主要有哈希(Hash,或称为散列)​、对称加密(Symm…...

STM32STM8芯片擦除与读保护

连接STM单片机与断开单片机连接, 点击擦除就可以了。 文件选HEX在选择Verify进行下载。...

Qwen2.5技术报告阅读

论文概述 ⸻ 🧠 1. 模型概述 Qwen2.5 是阿里巴巴推出的一系列大语言模型(LLMs),在 预训练数据量 和 后训练方法 上都比前一代 Qwen2 有了显著提升。 ⸻ 📈 2. 模型特点 • 预训练数据量提升:从 7 万亿…...

HDCP(二)

HDCP加密算法实现详解 HDCP(高带宽数字内容保护)的加密算法实现涉及对称加密、密钥派生、动态同步机制等核心环节,其设计兼顾实时性与安全性。以下从算法类型、流程实现、硬件集成等角度展开分析: 1. 加密算法类型与版本差异 •…...

POSIX线程(pthread)库:线程的终止与管理

在POSIX线程(pthread)库中,线程的终止和管理涉及多个关键函数。以下是关于线程终止的pthread系列函数的详细介绍: 1. pthread_exit:线程主动退出 ✨ 功能: 允许线程主动终止自身,并返回一个退出…...

Elasticsearch 系列专题 - 第三篇:搜索与查询

搜索是 Elasticsearch 的核心功能之一。本篇将介绍如何构建高效的查询、优化搜索结果,以及调整相关性评分,帮助你充分发挥 Elasticsearch 的搜索能力。 1. 基础查询 1.1 Match Query 与 Term Query 的区别 Match Query:用于全文搜索,会对查询词进行分词。 GET /my_index/_…...

【AI提示词】Emoji风格排版艺术与设计哲学

提示说明 Emoji风格排版艺术与设计哲学。 提示词 请使用 Emoji 风格编辑以下段落,该风格以引人入胜的标题、每个段落中包含表情符号和在末尾添加相关标签为特点。请确保保持原文的意思。使用案例(春日穿搭) 🌸 2025春季穿搭灵…...

C语言 ——— 认识C语言

认识 main 函数 main 函数是程序的入口,程序执行时会从 main 函数的第一行开始执行,且一个工程中 main 函数有且只有一个 标准的 main 函数格式: int main() {return 0; } int 是类型,这里指的是 main 函数的返回类型 return…...

44、Spring Boot 详细讲义(一)

Spring Boot 详细讲义 目录 Spring Boot 简介Spring Boot 快速入门Spring Boot 核心功能Spring Boot 技术栈与集成Spring Boot 高级主题Spring Boot 项目实战Spring Boot 最佳实践总结 一、Spring Boot 简介 1. Spring Boot 概念和核心特点 1.1、什么是 Spring Boot&#…...

STM32硬件IIC+DMA驱动OLED显示——释放CPU资源,提升实时性

目录 前言 一、软件IIC与硬件IIC 1、软件IIC 2、硬件IIC 二、STM32CubeMX配置KEIL配置 三、OLED驱动示例 1、0.96寸OLED 2、OLED驱动程序 3、运用示例 4、效果展示 总结 前言 0.96寸OLED屏是一个很常见的显示模块,其驱动方式在用采IIC通讯时,常用软件IIC…...

Android 中绕过hwbinder 实现跨模块对audio 的HAL调用

需求 Audio 模块中专门为 TV 产品添加了一些代码,需要在 hdmi 的 HAL 代码中进行调用以完成某些功能。 解决方法 首先将 hdmi HAL 要调用的 audio 接口函数所在的 .so 链接到最基本的 lib.primay.amlogic.so 中(其它平台上这个 .so 文件的名字也可能是…...

基于单片机技术的手持式酒精检测电路设计

基于STC89C52单片机的酒精检测仪设计 目录 基于STC89C52单片机的酒精检测仪设计一、简介二、酒精测试仪总体方案设计2.1 酒精检测仪设计要求分析2.2 设计框图 三、硬件设计3.1 酒精检测电路3.2 模数转换电路3.3 STC89c52单片机电路3.4 LED显示电路3.5 声光报警电路3.6 按键和复…...

【车道线检测(0)】卷首语

车道线检测领域,早期的LaneNet、CondLaneNet等模型。现在在精度、实时性、复杂场景适应性等方面有了更多进展。 ​Head(输出头)的设计角度分类 在车道线检测任务中,Head(输出头)的设计角度直接影响模型的…...

记一次某网络安全比赛三阶段webserver应急响应解题过程

0X01 任务说明 0X02 靶机介绍 Webserver(Web服务器)是一种软件或硬件设备,用于接收、处理并响应来自客户端(如浏览器)的HTTP请求,提供网页、图片、视频等静态或动态内容,是互联网基础设施的核心…...

AI 越狱技术剖析:原理、影响与防范

一、AI 越狱技术概述 AI 越狱是指通过特定技术手段,绕过人工智能模型(尤其是大型语言模型)的安全防护机制,使其生成通常被禁止的内容。这种行为类似于传统计算机系统中的“越狱”,旨在突破模型的限制,以实…...

项目进度延误的十大原因及应对方案

项目进度延误主要源于以下十大原因:目标不明确、需求频繁变更、资源配置不足或不合理、沟通不畅、风险管理不足、缺乏有效的项目监控、技术难题未及时解决、团队协作效率低下、决策链过长、外部因素影响。其中,需求频繁变更是导致延误的关键因素之一&…...

瑞友客户端登录GS_ERP时,报错: 由于安全许可证服务器不能提供许可证,连接被中断的解决方法

瑞友客户端登录GS_ERP时,报错:由于安全许可证服务器不能提供许可证,连接被中断的解决方法 瑞友客户端登录GS_ERP时, 报错:由于安全许可证服务器不能提供许可证,连接被中断的解决方法是由于远程桌面连接协议…...

android wifi通过命令行打开2.4G热点

android系统支持2G和5G,但车机系统应用只支持5G,但是需要测试2.4G的射频 方法如下: 1、adb shell 进去,su 指定root权限,确保热点处于关闭状态 2、开启热点为www99999, 密码为12345678, wpa2的加密协议 cm…...

truncate,drop,delete分析

truncate,drop,delete对比分析 特性 TRUNCATE DROP DELETE **操作对象** 表中的所有数据 整个表及其所有数据 表中的特定数据 **是否保留表结构** 是 否 是 **是否可恢复** 不可恢复 不可恢复 可恢复 **性能** 高 高 低(逐行删除) …...

vue+flask图书知识图谱推荐系统

文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 关注B站,有好处! 编号: F025 架构: vueflaskneo4jmysql 亮点:协同过滤推荐算法知识图谱可视化 支持爬取图书数据,数据超过万条&am…...

什么是微前端?有什么好处?有哪一些方案?

微前端(Micro Frontends) 微前端是一种架构理念,借鉴了微服务的思想,将一个大型的前端应用拆分为多个独立、自治的子应用,每个子应用可以由不同团队、使用不同技术栈独立开发和部署,最终聚合为一个整体产品…...

prompts提示词经典模板

prompts.py 中的提示词模板详解 文件中定义了两个核心提示词模板:REASON_PROMPT 和 RELEVANT_EXTRACTION_PROMPT。这两个模板在 DeepResearcher 的推理过程中扮演着关键角色。下面我将详细解析这两个模板的结构和功能。 REASON_PROMPT 详解 REASON_PROMPT 是用于指…...

pytorch软件封装

封装代码,通过传入文件名,即可输出类别信息 上一章节,我们做了关于动物图像的分类,接下来我们把程序封装,然后进行预测。 单张图片的predict文件 predict.py 按着路径,导入单张图片做预测from torchvis…...

DAY02:【pytorch】计算图与动态图机制

一、引言 在深度学习框架中,计算图是理解自动求导和模型优化的核心概念。无论是PyTorch的动态图机制,还是TensorFlow早期的静态图模式,计算图都扮演着关键角色。本文将深入解析计算图的基本原理,并结合PyTorch代码演示动态图的运…...

基于元学习(Meta-Learning)的恶意流量检测

元学习(Meta-Learning),即“学会学习”(Learning to Learn),通过让模型从多个相关任务中提取通用知识,实现对新任务的快速适应。在恶意流量检测领域,元学习的核心价值在于从少量攻击样本中泛化出检测规则,尤其适用于新型攻击、定向APT攻击等数据稀缺场景。 一、元学习…...

JavaScript:游戏开发的利器

在近年来的科技迅速发展中,JavaScript 已逐渐成为游戏开发领域中最受欢迎的编程语言之一。它的跨平台特性、广泛的社区支持、丰富的库和框架使得开发者能够快速、有效地创建各种类型的游戏。本文将深入探讨 JavaScript 在游戏开发中的优势。 一、跨平台支持 JavaSc…...

玩转Docker | 使用Docker搭建pinry图片展示系统

玩转Docker | 使用Docker搭建pinry图片展示系统 前言一、Pinry介绍Pinry 简介Pinry 特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署pinry服务下载镜像创建容器检查容器状态检查服务端口安全设置四、访问pinry应用五、pinry基本使用5.1 注册pinry账号…...

DAPP实战篇:使用web3.js实现前端输入钱包地址查询该地址的USDT余额——前端篇

专栏:区块链入门到放弃查看目录-CSDN博客文章浏览阅读385次。为了方便查看将本专栏的所有内容列出目录,按照顺序查看即可。后续也会在此规划一下后续内容,因此如果遇到不能点击的,代表还没有更新。声明:文中所出观点大多数源于笔者多年开发经验所总结,如果你想要知道区块…...

企业信息化-系统架构师(九十八)

1在对一个软件系统进行设计与确认后,需要进行架构复审,架构复审目的标识潜在风险,及早发现架构的缺陷和漏洞,在架构复审过程中,主要由()决定架构满足需求,质量需求是否在设计中体现。…...

【C++算法】54.链表_合并 K 个升序链表

文章目录 题目链接:题目描述:解法C 算法代码: 题目链接: 23. 合并 K 个升序链表 题目描述: 解法 解法一:暴力解法 每个链表的平均长度为n,有k个链表,时间复杂度O(nk^2) 合并两个有序…...

阿里云CDN应对DDoS攻击策略

阿里云CDN遭遇DDoS攻击时,可通过以下综合措施进行应对,保障服务的稳定性和可用性: 1. 启用阿里云DDoS防护服务 阿里云提供专业的DDoS防护服务,通过流量清洗中心过滤恶意流量,确保合法请求正常传输。该服务支持按需选…...

MySQL8的索引跳跃扫描原理

#MySQL 8 的索引跳跃扫描(Index Skip Scan)原理 1. 什么是索引跳跃扫描?索引跳跃扫描(Index Skip Scan)是 MySQL 8.0.13 引入的一种优化技术,允许在某些情况下跳过联合索引的最左前缀字段,仍然…...

centos 启动nginx 服务器

✅ 如果你是通过 yum 安装的 Nginx(推荐方式): 🔹 启动 Nginx: sudo systemctl start nginx 🔹 设置开机自启(建议开启): sudo systemctl enable nginx &#x1f53…...

格式化输出

% 符号相关 数据类型代码 %s:字符串 示例:print("名字是 %s" % "Tom") → 名字是 Tom%c:字符/ASCII码 示例:print("%c" % 65) → A%d/%i:有符号整数 示例:print("年龄…...

[leetcode]动态规划:斐波那契数列

一.线性dp 1.0什么是线性dp 线性DP就是指状态的转移具有线性递推关系&#xff0c;每个状态只依赖之前的状态&#xff0c;按照线性顺序一步步递推下去。 1.1斐波那契数列问题 #include <iostream> #include <vector> using namespace std; int main() { in…...

HackMyVM - todd记录

HackMyVM - toddhttps://mp.weixin.qq.com/s/E_-hepdfY-0veilL1fl2QA...

【spark认任务提交】配置优先级顺序

配置优先级顺序 Spark-submit 命令行参数 (最高优先级)代码中通过 SparkConf 设置的参数 (在应用程序中直接设置)spark-defaults.conf 文件中的配置 实际应用中的建议 固定配置&#xff1a;将集群级别的默认配置放在 spark-defaults.conf 中应用特定配置&#xff1a;将应用特…...

如何建立高效的会议机制

建立高效的会议机制需做到&#xff1a;明确会议目标、制定并提前分发议程、控制会议时长、确保有效沟通与反馈、及时跟进执行情况。其中&#xff0c;明确会议目标是核心关键&#xff0c;它直接决定了会议的方向与效率。只有明确目标&#xff0c;会议才不会偏离初衷&#xff0c;…...

spark Core-RDD转换算子

1. map算子&#xff1a;对RDD中的数据逐条进行映射转换&#xff0c;可实现类型或值的转换。函数签名为 def map[U: ClassTag](f: T > U): RDD[U] 。 2. mapPartitions算子&#xff1a;以分区为单位处理数据&#xff0c;可进行任意处理。与 map 相比&#xff0c; map 是分区内…...