位置: 编程技术 - 正文

python并发编程之多进程、多线程、异步和协程详解(python并发和并行)

编辑:rootadmin

推荐整理分享python并发编程之多进程、多线程、异步和协程详解(python并发和并行),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python的并发,python 并发编程,python并发1000个http请求,python并发和并行,python并发和并行,python并行编程,python并发执行函数,python3并发,内容如对您有帮助,希望把文章链接给更多的朋友!

最近学习python并发,于是对多进程、多线程、异步和协程做了个总结。一、多线程

多线程就是允许一个进程内存在多个控制权,以便让多个函数同时处于激活状态,从而让多个函数的操作同时运行。即使是单CPU的计算机,也可以通过不停地在不同线程的指令间切换,从而造成多线程同时运行的效果。

多线程相当于一个并发(concunrrency)系统。并发系统一般同时执行多个任务。如果多个任务可以共享资源,特别是同时写入某个变量的时候,就需要解决同步的问题,比如多线程火车售票系统:两个指令,一个指令检查票是否卖完,另一个指令,多个窗口同时卖票,可能出现卖出不存在的票。

在并发情况下,指令执行的先后顺序由内核决定。同一个线程内部,指令按照先后顺序执行,但不同线程之间的指令很难说清除哪一个会先执行。因此要考虑多线程同步的问题。同步(synchronization)是指在一定的时间内只允许某一个线程访问某个资源。

1、thread模块

2、threading模块threading.Thread 创建一个线程。

给判断是否有余票和卖票,加上互斥锁,这样就不会造成一个线程刚判断没有余票,而另外一个线程就执行卖票操作。

二、协程(又称微线程,纤程)

协程,与线程的抢占式调度不同,它是协作式调度。协程也是单线程,但是它能让原来要使用异步+回调方式写的非人类代码,可以用看似同步的方式写出来。

1、协程在python中可以由生成器(generator)来实现。

首先要对生成器和yield有一个扎实的理解.

调用一个普通的python函数,一般是从函数的第一行代码开始执行,结束于return语句、异常或者函数执行(也可以认为是隐式地返回了None)。

一旦函数将控制权交还给调用者,就意味着全部结束。而有时可以创建能产生一个序列的函数,来“保存自己的工作”,这就是生成器(使用了yield关键字的函数)。

能够“产生一个序列”是因为函数并没有像通常意义那样返回。return隐含的意思是函数正将执行代码的控制权返回给函数被调用的地方。而"yield"的隐含意思是控制权的转移是临时和自愿的,我们的函数将来还会收回控制权。

看一下生产者/消费者的例子:

当程序执行到produce的yield i时,返回了一个generator并暂停执行,当我们在custom中调用p.next(),程序又返回到produce的yield i 继续执行,这样 l 中又append了元素,然后我们print l.pop(),直到p.next()引发了StopIteration异常。

2、Stackless Python

3、greenlet模块

python并发编程之多进程、多线程、异步和协程详解(python并发和并行)

基于greenlet的实现则性能仅次于Stackless Python,大致比Stackless Python慢一倍,比其他方案快接近一个数量级。其实greenlet不是一种真正的并发机制,而是在同一线程内,在不同函数的执行代码块之间切换,实施“你运行一会、我运行一会”,并且在进行切换时必须指定何时切换以及切换到哪。

4、eventlet模块

三、多进程1、子进程(subprocess包)

在python中,通过subprocess包,fork一个子进程,并运行外部程序。

调用系统的命令的时候,最先考虑的os模块。用os.system()和os.popen()来进行操作。但是这两个命令过于简单,不能完成一些复杂的操作,如给运行的命令提供输入或者读取命令的输出,判断该命令的运行状态,管理多个命令的并行等等。这时subprocess中的Popen命令就能有效的完成我们需要的操作

利用subprocess.PIPE将多个子进程的输入和输出连接在一起,构成管道(pipe):

communicate() 方法从stdout和stderr中读出数据,并输入到stdin中。

2、多进程(multiprocessing包)

(1)、multiprocessing包是Python中的多进程管理包。与threading.Thread类似,它可以利用multiprocessing.Process对象来创建一个进程。

进程池 (Process Pool)可以创建多个进程。

apply_async(func,args) 从进程池中取出一个进程执行func,args为func的参数。它将返回一个AsyncResult的对象,你可以对该对象调用get()方法以获得结果。

close() 进程池不再创建新的进程

join() wait进程池中的全部进程。必须对Pool先调用close()方法才能join。

(2)、多进程共享资源

通过共享内存和Manager对象:用一个进程作为服务器,建立Manager来真正存放资源。

其它的进程可以通过参数传递或者根据地址来访问Manager,建立连接后,操作服务器上的资源。

四、异步

无论是线程还是进程,使用的都是同步进制,当发生阻塞时,性能会大幅度降低,无法充分利用CPU潜力,浪费硬件投资,更重要造成软件模块的铁板化,紧耦合,无法切割,不利于日后扩展和变化。

不管是进程还是线程,每次阻塞、切换都需要陷入系统调用(system call),先让CPU跑操作系统的调度程序,然后再由调度程序决定该跑哪一个进程(线程)。多个线程之间在一些访问互斥的代码时还需要加上锁,

现下流行的异步server都是基于事件驱动的(如nginx)。

异步事件驱动模型中,把会导致阻塞的操作转化为一个异步操作,主线程负责发起这个异步操作,并处理这个异步操作的结果。由于所有阻塞的操作都转化为异步操作,理论上主线程的大部分时间都是在处理实际的计算任务,少了多线程的调度时间,所以这种模型的性能通常会比较好。

标签: python并发和并行

本文链接地址:https://www.jiuchutong.com/biancheng/383436.html 转载请保留说明!

上一篇:微信 用脚本查看是否被微信好友删除(现在的微信怎么用脚本登陆了)

下一篇:python中json格式数据输出的简单实现方法(python jsonp)

  • 保险费车船税会计分录
  • 生产车间的办公用品费计入
  • 培训发生的住宿费 差旅费可以放入职工教育经费吗
  • 民办非企业单位设立分机构
  • 企业所得税财务费用借款利息扣除标准
  • 企业搬迁到外省之前的债务怎么处理
  • 进料边角料内销作进口报关单时为何要在备注栏备注活期
  • 收入未确认可以结转成本吗
  • 社保岗位补贴条件
  • 职员在外地出差怎么处理
  • 外包代发工资怎么做账
  • 个人承担的社保算工资吗
  • 企业年金的个人账户怎么查
  • 资本公积科目余额能出现小数吗
  • 计入在建的工资会计科目
  • 纯出口企业要交税吗
  • 100万的收入要交多少
  • 开具红字专用发票的情形
  • 教育附加费和地方教育附加费的计算
  • 增值税税率为6%的是什么服务
  • 一般纳税人取得免税农产品进项怎么抵扣
  • 企业专票抵税
  • 人民法院被收买了怎么办
  • 汇算清缴工资调增,账务要处理吗
  • 销售商品包装材料怎么做
  • multiple editions是什么版本
  • elf.exe是什么程序
  • 股东投资款验资后可以转出吗
  • 喜马拉雅山脉中最高的山峰是什么
  • 灯光璀璨的夜晚
  • 黄金旧料卖出收据怎么写
  • yii2权威指南
  • php 格式化字符串
  • 盘亏前累计折旧怎么算
  • vue3配置文件
  • yolov5中使用的限制目标宽高的方法防止梯度爆炸
  • torch.nn.Conv3d
  • 智能优化算法可以用到哪里
  • day29--Java泛型02
  • 债券溢折价摊销
  • 广告费应该计入产品成本吗
  • 生育保险断缴后果
  • 以前年度损益调整怎么做账
  • 哪些公司不交五险一金
  • 织梦网站停止使用了还侵权吗
  • 发布相应的搜索公告
  • 看望员工现金属于什么费用
  • 饭店招牌发光字
  • sqlserver2005 master与msdb数据库备份恢复过程
  • MySQL读写分离中间件
  • 股东收到投资收益会计科目
  • 购买的车位如何做账
  • 以土地出资的税费怎么算
  • 初次申报出口退税可能会遇到哪些问题
  • 基本户怎么提现金
  • 电子承兑汇票是什么
  • 个税返还申请流程
  • 应收账款增加说明企业什么
  • sqlserver如何设置主键
  • sql语句提取字符串中数字
  • 拒绝访问.exe出错
  • vmware虚拟机怎么改用户名
  • dcom进程
  • ubuntu 12.04 intel集成显卡设置分辨率的步骤分享
  • macbookair如何恢复系统
  • centos 网卡顺序
  • os x10.11el capitan beta6更新了什么?os x10.11el capitan beta6发布下载
  • linux怎么下载安装腾讯Tim?
  • Win8出现奇怪爆音的完美解决方法
  • linux如何快速入门
  • linux we
  • cocos2dx 教程
  • linux怎么使用c语言
  • Mongoose中document与object的区别示例详解
  • python科学计算程序
  • <script defer> defer 是什么意思
  • Javascript & DHTML 实例编程(教程)基础知识
  • 粮仓计算公式
  • 支付宝申领失业金申请审核多久
  • 手机微信怎么预约
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设