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

Python29_并发编程

Python29_并发编程文章目录Python29_并发编程[toc]基本概念1 并发 vs 并行2 Python 的并发模型多线程编程1 基本使用2 线程同步3 线程间通信多进程编程1 基本使用2 进程池3 进程间通信异步IO(asyncio)1 基本概念2 基本使用3 高级特性并发编程选择指南实际应用示例1 并发下载器2 并行计算常见问题并发编程 是现代软件开发中提高程序性能的重要手段。Python提供了多种并发编程方式包括多线程、多进程和异步IO。基本概念1 并发 vs 并行并发(Concurrency): 多个任务交替执行看起来像是同时运行并行(Parallelism): 多个任务真正同时执行需要多核CPU支持2 Python 的并发模型I/O密集型任务: 适合使用多线程或异步IOCPU密集型任务: 适合使用多进程多线程编程Python通过threading模块提供线程支持但由于GIL(全局 解释器 锁)的存在多线程不适合CPU密集型任务。1 基本使用importthreadingimporttimedeftask(name):print(f任务{name}开始)time.sleep(2)# 模拟I/O操作print(f任务{name}完成)# 创建线程threads[]foriinrange(3):tthreading.Thread(targettask,args(fThread-{i},))threads.append(t)t.start()# 等待所有线程完成fortinthreads:t.join()print(所有任务完成)2 线程同步使用锁Lock/RLock# 使用锁Lock/RLockimportthreadingimporttime counter0lockthreading.Lock()defincrement():globalcounterfor_inrange(100000):withlock:# 自动获取和释放锁counter1if__name____main__:thread_num5print(f{thread_num}个线程开始时间:{time.time():.2f})threads[]for_inrange(thread_num):tthreading.Thread(targetincrement)threads.append(t)t.start()fortinthreads:t.join()print(f最终计数器值:{counter})# 应该是500000print(f{thread_num}个线程结束时间:{time.time():.2f})使用Semaphore信号量注意如果信号量不等于1还是不能解决并发导致的【不安全的数据类型操作】问题# 使用Semaphore信号量importthreadingimporttime counter0lockthreading.Lock()defincrement(thread_name):globalcounterfor_inrange(20):withsemaphore:# 自动获取和释放锁print(f{thread_name}正在使用资源 )counter1print(f{thread_name}释放资源 )if__name____main__:# 使用信号量(如果信号量不等于1还是不能解决并发导致的【不安全的数据类型操作】问题)semaphorethreading.Semaphore(3)# 最多3个线程同时访问thread_num10threads[]print(f{thread_num}个线程开始时间:{time.time():.2f})foriinrange(thread_num):tthreading.Thread(targetincrement,args(fThreadName-{i},))threads.append(t)t.start()fortinthreads:t.join()print(f最终计数器值:{counter})# 应该是500000print(f{thread_num}个线程结束时间:{time.time():.2f})3 线程间通信# 使用队列importqueuedefproducer(q):foriinrange(5):print(f生产物品{i})q.put(i)time.sleep(0.5)q.put(None)# 结束信号defconsumer(q):whileTrue:itemq.get()ifitemisNone:breakprint(f消费物品{item})time.sleep(1)qqueue.Queue()threading.Thread(targetproducer,args(q,)).start()threading.Thread(targetconsumer,args(q,)).start()多进程编程多进程可以绕过GIL限制适合CPU密集型任务但进程间通信开销较大。1 基本使用frommultiprocessingimportProcessimportosdefcpu_bound_task(n):print(f进程{os.getpid()}计算{n}的平方)returnn*nif__name____main__:processes[]foriinrange(4):pProcess(targetcpu_bound_task,args(i,))processes.append(p)p.start()forpinprocesses:p.join()2 进程池frommultiprocessingimportPooldefsquare(x):returnx*xif__name____main__:withPool(4)aspool:# 4个工作进程# map方法resultspool.map(square,range(10))print(results)# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]# apply_async方法resultpool.apply_async(square,(10,))print(result.get())# 1003 进程间通信frommultiprocessingimportProcess,Queuedefworker(q):whileTrue:itemq.get()ifitemisNone:breakprint(f处理:{item})if__name____main__:qQueue()pProcess(targetworker,args(q,))p.start()foriinrange(5):q.put(i)q.put(None)# 结束信号p.join()异步IO(asyncio)asyncio是Python3.4引入的 标准库 适合I/O密集型任务使用单线程实现高并发。1 基本概念协程(Coroutine): 使用async def定义的函数事件循环(Event Loop): 协程的调度器Future/Task: 表示异步操作的结果2 基本使用importasyncioasyncdeffetch_data(url):print(f开始获取{url})awaitasyncio.sleep(2)# 模拟I/O操作print(f完成获取{url})returnf{url}的数据asyncdefmain():# 顺序执行result1awaitfetch_data(url1)result2awaitfetch_data(url2)print(result1,result2)# 并发执行task1asyncio.create_task(fetch_data(url3))task2asyncio.create_task(fetch_data(url4))awaittask1awaittask2# 使用gatherresultsawaitasyncio.gather(fetch_data(url5),fetch_data(url6),fetch_data(url7))print(results)asyncio.run(main())3 高级特性# 超时控制asyncdefslow_operation():awaitasyncio.sleep(5)return完成asyncdefmain():try:resultawaitasyncio.wait_for(slow_operation(),timeout3.0)exceptasyncio.TimeoutError:print(操作超时)# 事件循环控制asyncdefperiodic_task():whileTrue:print(执行周期性任务)awaitasyncio.sleep(1)asyncdefmain():taskasyncio.create_task(periodic_task())awaitasyncio.sleep(5)task.cancel()try:awaittaskexceptasyncio.CancelledError:print(任务已取消)并发编程选择指南方法适用场景优点缺点多线程I/O密集型GUI应用轻量级共享内存方便受GIL限制不适合CPU密集型多进程CPU密集型任务绕过GIL利用多核内存开销大进程间通信复杂异步IO高并发I/O操作网络应用高效单线程高并发需要特殊库支持学习曲线陡峭实际应用示例1 并发下载器importaiohttpimportasyncioasyncdefdownload(url):asyncwithaiohttp.ClientSession()assession:asyncwithsession.get(url)asresponse:contentawaitresponse.read()print(f下载{url}完成长度:{len(content)})returncontentasyncdefmain():urls[https://www.python.org,https://www.google.com,https://www.github.com]tasks[download(url)forurlinurls]awaitasyncio.gather(*tasks)asyncio.run(main())2 并行计算frommultiprocessingimportPoolimportmathdefis_prime(n):ifn2:returnFalseforiinrange(2,int(math.sqrt(n))1):ifn%i0:returnFalsereturnTrueif__name____main__:numbersrange(1000000,1000100)withPool(4)aspool:resultspool.map(is_prime,numbers)primes[nforn,primeinzip(numbers,results)ifprime]print(f找到{len(primes)}个质数)常见问题GIL限制使用多进程代替多线程处理CPU密集型任务使用C扩展释放GIL死锁问题按固定顺序获取锁使用带超时的锁资源竞争使用线程安全的数据结构尽量减少共享状态协程阻塞避免在协程中使用阻塞I/O使用专门的异步库(aiohttp, asyncpg等)通过合理选择并发模型并正确实现可以显著提高Python程序的性能特别是在处理I/O密集型或CPU密集型任务时。

相关文章:

Python29_并发编程

Python29_并发编程 文章目录Python29_并发编程[toc]基本概念1 并发 vs 并行2 Python 的并发模型多线程编程1 基本使用2 线程同步3 线程间通信多进程编程1 基本使用2 进程池3 进程间通信异步IO(asyncio)1 基本概念2 基本使用3 高级特性并发编程选择指南实际应用示例1 并发下载器…...

开源项目管理软件OpenProject:团队协作的终极免费解决方案

开源项目管理软件OpenProject:团队协作的终极免费解决方案 【免费下载链接】openproject OpenProject is the leading open source project management software. 项目地址: https://gitcode.com/GitHub_Trending/op/openproject 还在为团队协作效率低下而烦…...

LinkSwift:八大网盘直链下载助手,告别限速烦恼的终极解决方案

LinkSwift:八大网盘直链下载助手,告别限速烦恼的终极解决方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中…...

AI_产品经理|一文读懂大模型到底是怎么工作的

Part 1|大模型为什么给人一种"无所不知"的错觉 很多人第一次用 ChatGPT 或 Claude 时的本能反应是:它怎么什么都知道? 答案其实没那么玄乎。 大模型和搜索引擎一样,干了同一件苦力活:看过了互联网上几乎所有…...

告别数据孤岛!知识图谱:驱动企业智能决策的“大脑”引擎

专注于 知识图谱构建与应用开发,提供一站式定制化服务,帮助企业和科研机构高效管理知识资源、挖掘隐性关系、实现智能决策。服务内容包括: 知识图谱构建:从数据采集、实体抽取、关系识别到图谱建模,全流程专业处理&am…...

2026最新突破,Transformer架构升级、GLM-5深度解析,效率与成本平衡大揭秘!

引言 2026年,大模型技术迎来了前所未有的发展浪潮。从 GLM-5 到最新的 Transformer 变体,技术边界不断被突破。本文将深入分析当前大模型领域的关键技术进展。 一、Transformer 架构的演进 1.1 位置编码的新突破 传统 Transformer 使用固定的位置编码&am…...

微软借助环境感知服务网络简化 AKS 服务网格管理,开启新功能指南来了!

微软借助环境感知服务网络简化 AKS 服务网格扩展与管理微软借助基于环境感知(ambient)的服务网络,简化了 Azure Kubernetes 服务(AKS)的服务网格扩展和管理。以下是如何开启这一功能。如果你正在使用 Kubernetes&#…...

RTX3050笔记本跑TensorFlow-GPU?保姆级避坑指南(Win11 + CUDA 11.5 + cuDNN 8.3.3)

RTX3050笔记本TensorFlow-GPU实战:Win11环境下的精准配置与性能调优 1. 笔记本GPU环境配置的特殊挑战 RTX3050笔记本在深度学习应用中面临着一系列独特挑战。与台式机不同,笔记本的集成显卡设计、功耗限制和散热问题常常成为配置过程中的隐形杀手。许多用…...

8大主流网盘直链下载工具LinkSwift:架构解析与技术实现深度剖析

8大主流网盘直链下载工具LinkSwift:架构解析与技术实现深度剖析 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云…...

Source Han Serif CN开源中文字体:企业级字体解决方案的技术实现与应用实践

Source Han Serif CN开源中文字体:企业级字体解决方案的技术实现与应用实践 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 在数字内容创作和商业设计领域,中文…...

Python实战:基于Hessian矩阵的Steger激光条纹中心提取算法

1. 激光条纹中心提取的工业应用场景 在工业质检领域,激光三角测量技术被广泛应用于物体表面形貌检测。当激光器投射到物体表面时,会形成一条明亮的激光条纹。这条条纹的形变程度反映了物体表面的高度变化,而要精确计算这些形变,首…...

NLP 注意力机制:从Transformer到GPT

NLP 注意力机制:从Transformer到GPT 1. 引言 注意力机制(Attention Mechanism)已成为现代自然语言处理(NLP)的核心技术,从Transformer架构的提出到GPT系列模型的演进,注意力机制的应用和改进推动…...

RabbitMQ 核心角色:什么是生产者和消费者?全流程图解+实战详解

RabbitMQ 核心角色:什么是生产者和消费者?全流程图解实战详解前言一、核心概念定义:什么是 RabbitMQ 生产者和消费者?1.1 生产者(Producer):定义与作用1.2 消费者(Consumer&#xff…...

PyTorch 分布式训练:DDP vs FSDP

PyTorch 分布式训练:DDP vs FSDP 核心结论 DDP (DistributedDataParallel):基于数据并行的分布式训练方法,适用于中小规模模型FSDP (FullyShardedDataParallel):基于模型分片的分布式训练方法,适用于超大规模模型性能对…...

RabbitMQ 实战指南:如何声明队列?队列声明必要参数与完整用法详解

RabbitMQ 实战指南:如何声明队列?队列声明必要参数与完整用法详解前言一、队列声明认知:什么是队列声明?为什么要声明?1.1 定义1.2 核心作用1.3 队列声明流程图二、队列声明基础语法:如何声明一个队列&…...

消息中间件实战:RabbitMQ基本架构与核心组件全解析

消息中间件实战:RabbitMQ基本架构与核心组件全解析前言一、RabbitMQ 架构认知:RabbitMQ 基本架构是什么?1.1 架构定义1.2 整体架构流程图1.3 架构核心特点二、RabbitMQ 核心组件:RabbitMQ 包含哪些核心组件?2.1 组件一…...

BUAA编译原理核心考点实战解析:从随堂测试到知识脉络

1. 从零散题目到知识图谱:编译原理学习新视角 第一次翻开编译原理课本时,相信很多同学和我一样,面对词法分析、语法分析、语义分析这些概念一头雾水。更让人头疼的是,随堂测试里的题目看似简单,却总能在细节处挖坑无数…...

实战Windbg:从线上死锁到内存异常的全链路调试指南

1. 初识Windbg:调试利器与线上救火场景 第一次接触Windbg是在一个深夜的线上告警中。当时我们的订单处理服务突然卡死,监控显示线程数暴涨但CPU利用率却很低,典型的死锁特征。由于是生产环境,既不能随意重启服务,又无法…...

从实验室到日常生活:马吕斯定律在LCD屏幕和太阳镜中的神奇应用

偏振光的魔法:马吕斯定律如何塑造现代科技产品 清晨的阳光透过窗帘缝隙洒进房间,你伸手摸到床头的手机,屏幕瞬间亮起——这个再普通不过的动作背后,隐藏着一个200多年前发现的物理定律。当我们戴上太阳镜在户外活动,或…...

Livox Avia面阵激光雷达深度解析:双扫描模式如何重塑行业应用边界

1. Livox Avia面阵激光雷达的核心突破:双扫描模式解析 第一次拿到Livox Avia时,最让我惊讶的是它不到500克的机身里竟藏着两种完全不同的扫描模式。这就像一台相机同时拥有广角镜头和长焦镜头——非重复扫描模式如同广角镜头,能瞬间捕捉70.47…...

从指示灯到指令:全面解析仿真器连接与调试实战要点

1. 仿真器连接前的硬件准备 第一次拿到仿真器时,很多新手开发者会迫不及待地直接连接目标板开始调试,这种做法往往会导致各种连接问题。根据我多年的嵌入式开发经验,正确的做法是先做好充分的硬件准备工作。 首先需要检查仿真器的接口类型。目…...

终极指南:OpenIPC固件在君正T31平台烧录疑难问题完全解决方案

终极指南:OpenIPC固件在君正T31平台烧录疑难问题完全解决方案 【免费下载链接】firmware Alternative IP Camera firmware from an open community 项目地址: https://gitcode.com/gh_mirrors/fir/firmware OpenIPC是一款基于Buildroot的开源IP摄像头固件项目…...

从零开始:Nuclei工具的快速安装与配置指南

1. 为什么选择Nuclei进行漏洞扫描 第一次接触Nuclei是在去年的一次内部安全审计中。当时我们需要在短时间内对上百个Web服务进行漏洞检测,传统的手动测试方式显然不现实。同事推荐了这款开源工具,用他的话说就是"像瑞士军刀一样全能"。实际使用…...

如何轻松实现Zotero中文文献自动化管理:Jasminum插件的完整实践指南

如何轻松实现Zotero中文文献自动化管理:Jasminum插件的完整实践指南 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件,用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasminum 还…...

CANoe回灌报文信号值修改实战:用CAPL脚本动态调整Replay模块回放数据(附完整代码)

CANoe回灌报文信号值动态修改实战指南:CAPL脚本深度解析与代码优化 在汽车电子测试领域,回灌测试(Replay Test)是验证控制器逻辑的重要手段。但实际工作中,工程师常遇到这样的困境:精心录制的BLF文件中的某…...

从Cortex-M3到RTOS:构建嵌入式开发的核心知识图谱

1. Cortex-M3内核的底层奥秘 第一次接触Cortex-M3内核时,我被它精巧的设计震撼到了。这个只有拇指大小的芯片里,竟然藏着如此复杂的运行机制。就像打开一个精密的瑞士手表,每个齿轮都严丝合缝地配合着。Cortex-M3采用哈佛架构,这意…...

高效论文降重方案:2026年TOP5平台极限横评,AIGC疑似率实测降至5%!

【博主避坑指南】 CSDN的科研人们,5月定稿季到了,你的论文过审了吗?最近我每天收到的私信全在哀嚎:“老学长,我为了降重用了某某大模型改写,查重率倒是降到7%了,但教务处新上的‘知网AIGC检测V5…...

气象科研入门:手把手教你用FileZilla免费下载葵花8号卫星数据(附详细FTP配置)

气象科研实战:零基础获取葵花8号卫星数据的完整指南 第一次接触卫星数据下载时,我盯着满屏的专业术语和复杂的FTP配置界面手足无措。直到成功下载到第一个NetCDF文件,才发现原来获取葵花8号数据并没有想象中那么困难——只要掌握正确的工具和…...

OpenPortal V5认证计费系统实战:如何用华为AC6005搭建企业级WiFi认证(附配置代码)

华为AC6005与OpenPortal V5企业级WiFi认证系统深度整合指南 企业无线网络认证架构设计核心要素 在数字化办公环境中,稳定安全的无线网络接入已成为现代企业的刚需。华为AC6005控制器与OpenPortal V5认证计费系统的组合,为中型企业提供了性价比极高的无线…...

生成式AI推荐策略正在过时?3家独角兽已切换至“动态意图-反馈-重生成”闭环范式(内部架构首度公开)

第一章:生成式AI应用个性化推荐策略 2026奇点智能技术大会(https://ml-summit.org) 生成式AI正从根本上重塑个性化推荐系统的架构范式——它不再局限于对用户历史行为的统计建模,而是通过隐式意图理解、跨模态内容生成与实时反馈闭环,实现从…...