位置: 编程技术 - 正文

使用Python的Twisted框架编写非阻塞程序的代码示例(pythonsetter)

编辑:rootadmin

推荐整理分享使用Python的Twisted框架编写非阻塞程序的代码示例(pythonsetter),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python \t怎么用,python twinter,python twine,python twisted,python twisted,python twisted,python twilio,python twisted,内容如对您有帮助,希望把文章链接给更多的朋友!

先来看一段代码:

运行一下,结果如下所示:

这是一段顺序执行的代码。四个消费者,为一个人安装需要3秒的时间,那么四个人就是秒。这样处理不是很令人满意,所以看一下第二个使用了线程的例子:

运行一下:

这次是一段并行执行的代码,使用了5个工作线程。个消费者每个花费3s意味着总共s的时间,不过用了5个线程并行执行总共只花费了9s的时间。这段代码有点复杂,很大一部分代码是用于管理并发,而不是专注于算法或者业务逻辑。另外,程序的输出结果看起来也很混杂,可读性也天津市。即使是简单的多线程的代码同样也难以写得很好,所以我们转为使用Twisted:

运行结果:

使用Python的Twisted框架编写非阻塞程序的代码示例(pythonsetter)

这次我们得到了完美的执行代码和可读性强的输出结果,并且没有使用线程。我们并行地处理了个消费者,也就是说,本来需要s的执行时间在3s之内就已经完成。这个窍门就是我们把所有的阻塞的对sleep()的调用都换成了Twisted中对等的task.deferLater()和回调函数。由于现在处理的操作在其他地方进行,我们就可以毫不费力地同时服务于个消费者。前面提到处理的操作发生在其他的某个地方。现在来解释一下,算术运算仍然发生在CPU内,但是现在的CPU处理速度相比磁盘和网络操作来说非常快。所以给CPU提供数据或者从CPU向内存或另一个CPU发送数据花费了大多数时间。我们使用了非阻塞的操作节省了这方面的时间,例如,task.deferLater()使用了回调函数,当数据已经传输完成的时候会被激活。另一个很重要的一点是输出中的Goodmorning from Twisted developer和Bye from Twisted developer!信息。在代码开始执行时就已经打印出了这两条信息。如果代码如此早地执行到了这个地方,那么我们的应用真正开始运行是在什么时候呢?答案是,对于一个Twisted应用(包括Scrapy)来说是在reactor.run()里运行的。在调用这个方法之前,必须把应用中可能用到的每个Deferred链准备就绪,然后reactor.run()方法会监视并激活回调函数。注意,reactor的主要一条规则就是,你可以执行任何操作,只要它足够快并且是非阻塞的。现在好了,代码中没有那么用于管理多线程的部分了,不过这些回调函数看起来还是有些杂乱。可以修改成这样:

运行的结果和前一个例子相同。这段代码的作用和上一个例子是一样的,但是看起来更加简洁明了。inlineCallbacks生成器可以使用一些一些Python的机制来使得inline_install()函数暂停或者恢复执行。inline_install()函数变成了一个Deferred对象并且并行地为每个消费者运行。每次yield的时候,运行就会中止在当前的inline_install()实例上,直到yield的Deferred对象完成后再恢复运行。现在唯一的问题是,如果我们不止有个消费者,而是有,比如个消费者时又该怎样?这段代码会同时开始个同时执行的序列(比如HTTP请求、数据库的写操作等等)。这样做可能没什么问题,但也可能会产生各种失败。在有巨大并发请求的应用中,例如Scrapy,我们经常需要把并发的数量限制到一个可以接受的程度上。在下面的一个例子中,我们使用task.Cooperator()来完成这样的功能。Scrapy在它的Item Pipeline中也使用了相同的机制来限制并发的数目(即CONCURRENT_ITEMS设置):

运行结果:

从上面的输出中可以看到,程序运行时好像有5个处理消费者的槽。除非一个槽空出来,否则不会开始处理下一个消费者的请求。在本例中,处理时间都是3秒,所以看起来像是5个一批次地处理一样。最后得到的性能跟使用线程是一样的,但是这次只有一个线程,代码也更加简洁更容易写出正确的代码。

PS:deferToThread使同步函数实现非阻塞wisted的defer.Deferred (from twisted.internet import defer)可以返回一个deferred对象.

注:deferToThread使用线程实现的,不推荐过多使用***把同步函数变为异步(返回一个Deferred)***twisted的deferToThread(from twisted.internet.threads import deferToThread)也返回一个deferred对象,不过回调函数在另一个线程处理,主要用于数据库/文件读取操作

下面这儿完整的例子可以给大家参考一下

详解Python的Twisted框架中reactor事件管理器的用法 铺垫在大量的实践中,似乎我们总是通过类似的方式来使用异步编程:监听事件事件发生执行对应的回调函数回调完成(可能产生新的事件添加进监听

实例解析Python的Twisted框架中Deferred对象的用法 Deferred对象结构Deferred由一系列成对的回调链组成,每一对都包含一个用于处理成功的回调(callbacks)和一个用于处理错误的回调(errbacks)。初始状态

剖析Python的Twisted框架的核心特性 一.reactortwisted的核心是reactor,而提到reactor不可避免的是同步/异步,阻塞/非阻塞,在Dave的第一章概念性介绍中,对同步/异步的界限有点模糊,关于同

标签: pythonsetter

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

上一篇:Python的Twisted框架中使用Deferred对象来管理回调函数(python twilio)

下一篇:详解Python的Twisted框架中reactor事件管理器的用法(python traits)

  • 账本印花税的计税依据
  • 销项税额的计算方法
  • 甲方应项目具备开工条件
  • 服装类发票可以做账吗
  • 税务开票系统如何导入客户信息
  • 一正一负发票是什么意思
  • 增值税专用发票和普通发票的区别
  • 免抵退税办法不得抵扣的进项税额包含了什么业务
  • 工程结算怎么结转收入
  • 印花税算错了可以补交吗
  • 应收账款无法收回分录
  • 水利建设基金2021
  • 现金买东西可以退吗
  • 一般纳税人地税怎么收费
  • 租车服务的税率
  • 税局未核定印花税一直没有交怎么办
  • 主营业务税金及附加怎么算
  • 一般纳税人收取的下列款项中,应并入销售额
  • 没有发生关联交易需要关联申报吗?
  • 对外支付类型
  • 分公司负债,总公司要负担
  • 客户到款打到子公司账上如何转回
  • 增值税影不影响企业利润
  • 什么叫保理支付
  • 滴滴开的发票能否抵扣进项税
  • 账外资产评估入账固定资产折旧可以税前扣除吗?
  • windows 10如何清除联网记录
  • 技术入股分红怎么计算
  • 稳增长促转型
  • 智能路由器哪个牌子好
  • 建筑施工企业关键技术岗位八大员配置要求
  • 租赁固定资产成本怎么算
  • 财务人员如何管控费用支出
  • 企业合并支付的资产评估费计入
  • 生产成本二级科目会计分录
  • 深度学习环境配置(pytorch版本)----超级无敌详细版(有手就行)
  • vue.3
  • 雪花算法时钟回拨
  • php验证系统
  • php应用实例
  • 个税返还的会计处理
  • 管家婆软件如何做账
  • 银行代发工资会扣个人所得税吗
  • 关于幼儿园国培的要求和建议
  • python opencv如何获取图片尺寸
  • 股东之间股权转让需要股东会决议吗
  • 购买加油卡如何做会计分录
  • 生产车间领用材料的会计分录
  • 提供劳务收入是指
  • 股本金如何归还股东
  • 劳务费可以开普票吗
  • 以前未入账固定资产补入账政府会计
  • 银行承兑汇票贴现的账务处理
  • 已付款发票未到怎么做分录
  • 白酒系列代理
  • 代扣个税返还需要交增值税吗
  • 个体工商户缴纳社保属于职工社保吗
  • 企业注销留抵税额怎么处理 最新
  • 购置办公大楼,会计处理
  • 库存商品盘点流程
  • 个人向公司账户存现金
  • sql server 2000安装好打开不显示名称和服务原因
  • mysql第二章
  • macOS 10.12 Beta 7更新了什么 macOS 10.12 Beta7更新内容汇总
  • windows无法
  • linux打成zip包
  • le启动exe是什么意思
  • windows10升级后
  • win7电脑弹窗多怎么解决
  • cocos2djs
  • android设计模式的应用场景
  • js onkeypress与onkeydown 事件区别详细说明
  • unity mathf.sin
  • bootstrap js插件
  • python语句查询
  • javascript学到什么程度
  • jQuery validate+artdialog+jquery form实现弹出表单思路详解
  • 北京税务跨区迁移不予受理,原因是什么
  • 小规模公司每月0申报怎么操作
  • 乳胶枕属于什么经营范围
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设