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

深入了解Python并发编程

并发方式线程[Thread]多线程几乎是每一个程序猿在使用每一种语言时都会首先想到用于解决并发的工具JS程序员请回避使用多线程可以有效的利用CPU资源Python例外。然而多线程所带来的程序的复杂度也不可避免尤其是对竞争资源的同步问题。然而在python中由于使用了全局解释锁GIL的原因代码并不能同时在多核上并发的运行也就是说Python的多线程不能并发很多人会发现使用多线程来改进自己的Python代码后程序的运行效率却下降了这是多么蛋疼的一件事呀实际上使用多线程的编程模型是很困难的程序员很容易犯错这并不是程序员的错误因为并行思维是反人类的我们大多数人的思维是串行精神分裂不讨论而且冯诺依曼设计的计算机架构也是以顺序执行为基础的。所以如果你总是不能把你的多线程程序搞定恭喜你你是个思维正常的程序猿Python提供两组线程的接口一组是thread模块提供基础的低等级Low Level接口使用Function作为线程的运行体。还有一组是threading模块提供更容易使用的基于对象的接口类似于Java可以继承Thread对象来实现线程还提供了其它一些线程相关的对象例如TimerLock使用thread模块的例子12345importthreaddefworker():thread worker functionprintWorkerthread.start_new_thread(worker)使用threading模块的例子123456importthreadingdefworker():thread worker functionprintWorkertthreading.Thread(targetworker)t.start()或者Java Style12345678910importthreadingclassworker(threading.Thread):def__init__(self):passdefrun():thread worker functionprintWorkertworker()t.start()进程 Process由于前文提到的全局解释锁的问题Python下比较好的并行方式是使用多进程这样可以非常有效的使用CPU资源并实现真正意义上的并发。当然进程的开销比线程要大也就是说如果你要创建数量惊人的并发进程的话需要考虑一下你的机器是不是有一颗强大的心。Python的mutliprocess模块和threading具有类似的接口。12345678frommultiprocessingimportProcessdefworker():thread worker functionprintWorkerpProcess(targetworker)p.start()p.join()由于线程共享相同的地址空间和内存所以线程之间的通信是非常容易的然而进程之间的通信就要复杂一些了。常见的进程间通信有管道消息队列Socket接口TCP/IP等等。Python的mutliprocess模块提供了封装好的管道和队列可以方便的在进程间传递消息。Python进程间的同步使用锁这一点喝线程是一样的。另外Python还提供了进程池Pool对象可以方便的管理和控制线程。远程分布式主机 Distributed Node随着大数据时代的到临摩尔定理在单机上似乎已经失去了效果数据的计算和处理需要分布式的计算机网络来运行程序并行的运行在多个主机节点上已经是现在的软件架构所必需考虑的问题。远程主机间的进程间通信有几种常见的方式TCPIPTCPIP是所有远程通信的基础然而API比较低级别使用起来比较繁琐所以一般不会考虑远程方法调用 Remote Function Call[RPC]远程对象 Remote Object远程对象是更高级别的封装程序可以想操作本地对象一样去操作一个远程对象在本地的代理。远程对象最广为使用的规范CORBACORBA最大的好处是可以在不同语言和平台中进行通信。当让不用的语言和平台还有一些各自的远程对象实现例如Java的RMIMS的DCOMPython的开源实现有许多对远程对象的支持Dopy]Fnorb CORBAICEomniORB CORBAPyroYAMI消息队列 Message Queue比起RPC或者远程对象消息是一种更为灵活的通信手段常见的支持Python接口的消息机制有RabbitMQZeroMQKafkaAWS SQS BOTO在远程主机上执行并发和本地的多进程并没有非常大的差异都需要解决进程间通信的问题。当然对远程进程的管理和协调比起本地要复杂。Python下有许多开源的框架来支持分布式的并发提供有效的管理手段包括CeleryCelery是一个非常成熟的Python分布式框架可以在分布式的系统中异步的执行任务并提供有效的管理和调度功能。SCOOPSCOOP Scalable COncurrent Operations in Python提供简单易用的分布式调用接口使用Future接口来进行并发。Dispy相比起Celery和SCOOPDispy提供更为轻量级的分布式并行服务PPPP Parallel Python是另外一个轻量级的Python并行服务AsyncoroAsyncoro是另一个利用Generator实现分布式并发的Python框架当然还有许多其它的系统我没有一一列出另外许多的分布式系统多提供了对Python接口的支持例如Spark伪线程 PseudoThread还有一种并发手段并不常见我们可以称之为伪线程就是看上去像是线程使用的接口类似线程接口但是实际使用非线程的方式对应的线程开销也不存的。greenletgreenlet提供轻量级的coroutines来支持进程内的并发。greenlet是Stackless的一个副产品使用tasklet来支持一中被称之为微线程mircothread的技术这里是一个使用greenlet的伪线程的例子123456789101112131415fromgreenletimportgreenletdeftest1():print12gr2.switch()print34deftest2():print56gr1.switch()print78gr1greenlet(test1)gr2greenlet(test2)gr1.switch()运行以上程序得到如下结果125634伪线程gr1 switch会打印12然后调用gr2 switch得到56然后switch回到gr1打印34然后伪线程gr1结束程序退出所以78永远不会被打印。通过这个例子我们可以看出使用伪线程我们可以有效的控制程序的执行流程但是伪线程并不存在真正意义上的并发。eventletgevent和concurence都是基于greenlet提供并发的。eventleteventlet是一个提供网络调用并发的Python库使用者可以以非阻塞的方式来调用阻塞的IO操作。123456789101112importeventletfromeventlet.greenimporturllib2urls[http://www.google.com,http://www.example.com,http://www.python.org]deffetch(url):returnurllib2.urlopen(url).read()pooleventlet.GreenPool()forbodyinpool.imap(fetch, urls):print(got body,len(body))执行结果如下(got body, 17629)(got body, 1270)(got body, 46949)eventlet为了支持generator的操作对urllib2做了修改接口和urllib2是一致的。这里的GreenPool和Python的Pool接口一致。geventgevent和eventlet类似1234567importgeventfromgeventimportsocketurls[www.google.com,www.example.com,www.python.org]jobs[gevent.spawn(socket.gethostbyname, url)forurlinurls]gevent.joinall(jobs, timeout2)print[job.valueforjobinjobs]执行结果如下[206.169.145.226, 93.184.216.34, 23.235.39.223]concurenceconcurence是另外一个利用greenlet提供网络并发的开源库我没有用过大家可以自己尝试一下。实战运用通常需要用到并发的场合有两种一种是计算密集型也就是说你的程序需要大量的CPU资源;另一种是IO密集型程序可能有大量的读写操作包括读写文件收发网络请求等等。计算密集型对应计算密集型的应用我们选用著名的蒙特卡洛算法来计算PI值。基本原理如下蒙特卡洛算法利用统计学原理来模拟计算圆周率在一个正方形中一个随机的点落在1/4圆的区域红色点的概率与其面积成正比。也就该概率 p Pi RR 4 R R 其中R是正方形的边长圆的半径。也就是说该概率是圆周率的1/4, 利用这个结论只要我们模拟出点落在四分之一圆上的概率就可以知道圆周率了为了得到这个概率我们可以通过大量的实验也就是生成大量的点看看这个点在哪个区域然后统计出结果。基本算法如下12345frommathimporthypotfromrandomimportrandomdeftest(tries):returnsum(hypot(random(), random()) 1for_inrange(tries))这里test方法做了ntries次试验返回落在四分之一圆中的点的个数。判断方法是检查该点到圆心的距离如果小于R则是在圆上。通过大量的并发我们可以快速的运行多次试验试验的次数越多结果越接近真实的圆周率。这里给出不同并发方法的程序代码非并发我们先在单线程但进程运行看看性能如何123456789101112131415161718frommathimporthypotfromrandomimportrandomimporteventletimporttimedeftest(tries):returnsum(hypot(random(), random()) 1for_inrange(tries))defcalcPi(nbFutures, tries):tstime.time()resultmap(test, [tries]*nbFutures)ret4.*sum(result)/float(nbFutures*tries)spantime.time()-tsprinttime spend , spanreturnretprintcalcPi(3000,4000)多线程 thread为了使用线程池我们用multiprocessing的dummy包它是对多线程的一个封装。注意这里代码虽然一个字的没有提到线程但它千真万确是多线程。通过测试我们开jing心ya的发现果然不出所料当线程池为1是它的运行结果和没有并发时一样当我们把线程池数字设置为5时耗时几乎是没有并发的2倍我的测试数据从5秒到9秒。所以对于计算密集型的任务还是放弃多线程吧。123456789101112131415161718192021frommultiprocessing.dummyimportPoolfrommathimporthypotfromrandomimportrandomimporttimedeftest(tries):returnsum(hypot(random(), random()) 1for_inrange(tries))defcalcPi(nbFutures, tries):tstime.time()pPool(1)resultp.map(test, [tries]*nbFutures)ret4.*sum(result)/float(nbFutures*tries)spantime.time()-tsprinttime spend , spanreturnretif__name____main__:pPool()print(pi {}.format(calcPi(3000,4000)))多进程 multiprocess理论上对于计算密集型的任务使用多进程并发比较合适在以下的例子中进程池的规模设置为5修改进程池的大小可以看到对结果的影响当进程池设置为1时和多线程的结果所需的时间类似因为这时候并不存在并发当设置为2时响应时间有了明显的改进是之前没有并发的一半然而继续扩大进程池对性能影响并不大甚至有所下降也许我的Apple Air的CPU只有两个核

相关文章:

深入了解Python并发编程

并发方式 线程([Thread]) 多线程几乎是每一个程序猿在使用每一种语言时都会首先想到用于解决并发的工具(JS程序员请回避),使用多线程可以有效的利用CPU资源(Python例外)。然而多线程所带来的程…...

视频怎么去水印?视频去水印软件哪个好用?2026实测方法盘点

视频怎么去水印?视频去水印软件哪个好用?2026实测方法盘点 刷到一条好视频想保存下来,打开相册发现角落里有个大水印,二次使用直接废了。做自媒体的更懂这种痛:从各个平台扒下来的素材,水印各不相同&#x…...

保姆级教程:在Win10上从零配置OpenSSH服务器,并用Termius实现iPad远程连接(含防火墙和用户权限避坑指南)

从零构建Win10 SSH服务:用Termius实现iPad远程开发的完整指南 当你躺在沙发上用iPad突然想修改一段代码,或是出差时急需访问家中电脑的文件,Win10自带的OpenSSH服务配合Termius这款优雅的SSH客户端,能让你摆脱物理距离的限制。但官…...

保姆级教程:手把手教你搞定Automation Studio 4.7.2.98安装与90天试用授权(含官方第三方学习资源指北)

从零开始掌握Automation Studio 4.7:完整安装指南与学习资源全景图 第一次打开Automation Studio时,那个闪烁的授权提示框就像一堵高墙。作为工业自动化领域的重要工具,这款由贝加莱(现属ABB集团)开发的集成开发环境&a…...

终极指南:用ViGEmBus免费解决Windows游戏手柄兼容性难题

终极指南:用ViGEmBus免费解决Windows游戏手柄兼容性难题 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 你是否曾经遇到过这样的情况&#xff1a…...

ContextMenuManager终极指南:如何快速清理Windows右键菜单提升系统效率

ContextMenuManager终极指南:如何快速清理Windows右键菜单提升系统效率 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 你是否厌倦了每次右键点击文件…...

为你的自动化工作流集成Taotoken提供稳定的大模型调用

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为你的自动化工作流集成Taotoken提供稳定的大模型调用 在构建自动化工作流时,无论是定时生成报告、处理用户反馈&#…...

英伟达巨额投资,四大云巨头财报亮眼,半导体产业扩张背后隐忧浮现

物理世界产能成为瓶颈云收入快速增长支撑巨头大规模投资。2026年第一季度,谷歌云、微软Azure、亚马逊AWS云业务表现出色,四家公司云业务合计季度营收超700亿美元,同比增长超40%。但物理世界产能受限,谷歌、微软、亚马逊订单积压严…...

DeepSeek拟融500亿,低价开源下营收堪忧,爆款产品能否撑起515亿美元估值?

融资消息与行业对比 5月8号晚上,The Information爆料,并有两位知情人士确认,DeepSeek要融500亿人民币,约73.5亿美元。此前,中国大模型公司单轮融资最高纪录是Kimi的20亿美元(约136亿人民币)&…...

2026 年豆包开启付费订阅,中国 AI 大模型商业化迎来大考!

豆包更新付费订阅,打破行业免费格局2026 年 5 月 4 日,字节跳动旗下 AI 产品豆包在苹果 App Store 悄然更新付费订阅方案。标准版 68 元/月、加强版 200 元/月、专业版 500 元/月,这三档价格梯度划破了中国 AI 大模型行业持续两年的“免费狂欢…...

洛谷 P1333:瑞瑞的木棍 ← 欧拉回路 + 并查集

【题目来源】 https://www.luogu.com.cn/problem/P1333 【题目描述】 瑞瑞有一堆的玩具木棍,每根木棍的两端分别被染上了某种颜色,现在他突然有了一个想法,想要把这些木棍连在一起拼成一条线,并且使得木棍与木棍相接触的两端颜色…...

Logseq AI助手插件:在知识管理笔记中集成ChatGPT智能写作与编辑

1. 项目概述:在Logseq中引入你的AI副驾驶 如果你和我一样,是个重度依赖Logseq来构建个人知识库的笔记爱好者,同时又对AI辅助写作和思考的潜力充满好奇,那么你肯定不止一次想过:要是能把ChatGPT的能力无缝集成到Logseq…...

独立开发者工具箱:2026年全栈与AI应用高效开发技术栈指南

1. 项目概述与核心价值作为一名在独立开发领域摸爬滚打了十多年的老兵,我深知一个道理:工具选型,是决定项目成败的第一道分水岭。你花在纠结技术栈、寻找合适API、调试部署环境上的每一分钟,都是从产品核心价值中偷走的时间。今天…...

基于Vue.js与AI对话的智能思维导图生成器开发实践

1. 项目概述:一个能“对话”的思维导图生成器最近在整理项目文档和梳理学习笔记时,我总感觉传统的思维导图工具少了点什么。要么是手动拖拽节点太繁琐,打断了思考的连贯性;要么是生成的导图结构僵化,难以体现思考的动态…...

LinkSwift:九大网盘直链解析工具使用指南

LinkSwift:九大网盘直链解析工具使用指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘 / 迅雷云…...

终极指南:如何用NPYViewer快速查看和可视化NumPy数组数据

终极指南:如何用NPYViewer快速查看和可视化NumPy数组数据 【免费下载链接】NPYViewer Load and view .npy files containing 2D and 1D NumPy arrays. 项目地址: https://gitcode.com/gh_mirrors/np/NPYViewer 还在为NumPy数组数据查看而烦恼吗?当…...

如何快速提升英文打字速度:Qwerty Learner完整打字练习指南

如何快速提升英文打字速度:Qwerty Learner完整打字练习指南 【免费下载链接】qwerty-learner 为键盘工作者设计的单词记忆与英语肌肉记忆锻炼软件 / Words learning and English muscle memory training software designed for keyboard workers 项目地址: https:…...

Adobe-GenP 3.0终极指南:5步免费解锁Adobe全家桶完整功能

Adobe-GenP 3.0终极指南:5步免费解锁Adobe全家桶完整功能 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP Adobe-GenP是一款专业的Adobe Creative Cloud通…...

3步解锁AcFunDown:你的A站视频离线保存专家

3步解锁AcFunDown:你的A站视频离线保存专家 【免费下载链接】AcFunDown 包含PC端UI界面的A站 视频下载器。支持收藏夹、UP主视频批量下载 😳仅供交流学习使用喔 项目地址: https://gitcode.com/gh_mirrors/ac/AcFunDown 你是否曾经遇到过这样的情…...

如何通过Noto Emoji实现跨平台表情符号统一:技术原理与应用实践

如何通过Noto Emoji实现跨平台表情符号统一:技术原理与应用实践 【免费下载链接】noto-emoji Noto Emoji fonts 项目地址: https://gitcode.com/gh_mirrors/no/noto-emoji 在数字通信日益全球化的今天,表情符号已成为跨越语言障碍的重要视觉语言。…...

Display Driver Uninstaller (DDU):彻底清理显卡驱动的终极解决方案

Display Driver Uninstaller (DDU):彻底清理显卡驱动的终极解决方案 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers…...

ThinkPad风扇控制终极指南:TPFanCtrl2让你的笔记本更安静高效 [特殊字符]

ThinkPad风扇控制终极指南:TPFanCtrl2让你的笔记本更安静高效 🚀 【免费下载链接】TPFanCtrl2 ThinkPad Fan Control 2 (Dual Fan) for Windows 10 and 11 项目地址: https://gitcode.com/gh_mirrors/tp/TPFanCtrl2 作为ThinkPad用户,…...

开发AI应用时如何借助Taotoken实现模型的热切换与降级

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 开发AI应用时如何借助Taotoken实现模型的热切换与降级 在构建面向用户的AI应用时,服务的稳定性至关重要。当应用依赖的…...

使用Taotoken后,在持续集成流水线中调用大模型的稳定性体验

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用Taotoken后,在持续集成流水线中调用大模型的稳定性体验 在软件开发的生命周期中,持续集成与持续部署&a…...

智能车信标FM信号不稳?用9018和UPC1677搭建射频功放的避坑指南

智能车信标FM信号不稳?用9018和UPC1677搭建射频功放的避坑指南 在智能车竞赛和电子设计项目中,稳定可靠的FM信标信号是确保车辆精确定位和导航的关键。然而,许多参赛团队在实际搭建射频功放电路时,常会遇到信号弱、传输距离不足、…...

HDLbits进阶实战:FSM与移位寄存器在复杂时序电路中的四种设计范式

1. 有限状态机与移位寄存器协同设计基础 在数字电路设计中,有限状态机(FSM)和移位寄存器就像是一对黄金搭档。FSM负责控制流程,而移位寄存器则擅长处理数据流。当它们配合使用时,可以解决许多复杂的时序逻辑问题。 我刚…...

2026届最火的六大降AI率网站实测分析

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 现在,主流的降AIGC工具,大多运用同义词替换、句式重组、插入语法噪声…...

2026最权威的六大AI写作平台解析与推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 作为智能写作工具来讲的 DeepSeek,能够高效地促进学术论文撰写效率有所提升。于选…...

32_AI短片实战第五弹:飞跃峡谷——高潮镜头的“放手”哲学与首帧脑补策略(附提示词)

文章目录 一、第十一镜:飞跃峡谷——从精确控制到主动放手 镜头设定 前期准备:多角度参考图 第一轮生成:比例失控 第二轮生成:视角偏差 关键转折:主动移除参考图 最终获得 二、关键策略:首帧脑补 vs. 首尾帧控制 传统思路:首尾帧控制 本片的策略:首帧脑补 经验法则 三、…...

2026届最火的AI写作平台推荐榜单

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 因学术写作要求持续提高,论文AI工具成了学生和研究人员的关键辅助办法&#xff0…...