位置: 编程技术 - 正文

剖析Python的Twisted框架的核心特性(twist python)

编辑:rootadmin

推荐整理分享剖析Python的Twisted框架的核心特性(twist python),希望有所帮助,仅作参考,欢迎阅读内容。

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

一. reactortwisted的核心是reactor,而提到reactor不可避免的是同步/异步,阻塞/非阻塞,在Dave的第一章概念性介绍中,对同步/异步的界限有点模糊,关于同步/异步,阻塞/非阻塞可参见知乎讨论。而关于proactor(主动器)和reactor(反应堆),这里有一篇推荐博客有比较详细的介绍。就reactor模式的网络IO而言,应该是同步IO而不是异步IO。而Dave第一章中提到的异步,核心在于:显式地放弃对任务的控制权而不是被操作系统随机地停止,程序员必须将任务组织成序列来交替的小步完成。因此,若其中一个任务用到另外一个任务的输出,则依赖的任务(即接收输出的任务)需要被设计成为要接收系列比特或分片而不是一下全部接收。显式主动地放弃任务的控制权有点类似协程的思考方式,reactor可看作协程的调度器。reactor是一个事件循环,我们可以向reactor注册自己感兴趣的事件(如套接字可读/可写)和处理器(如执行读写操作),reactor会在事件发生时回调我们的处理器,处理器执行完成之后,相当于协程挂起(yield),回到reactor的事件循环中,等待下一个事件来临并回调。reactor本身有一个同步事件多路分解器(Synchronous Event Demultiplexer),可用select/epoll等机制实现,当然twisted reactor的事件触发不一定是基于IO,也可以由定时器等其它机制触发。twisted的reactor无需我们主动注册事件和回调函数,而是通过多态(继承特定类,并实现所关心的事件接口,然后传给twisted reactor)来实现。关于twisted的reactor,有几个需要注意的地方:twisted.internet.reactor是单例模式,每个程序只能有一个reactor;尽量在reactor回调函数尽快完成操作,不要执行阻塞任务,reactor本质是单线程,用户回调代码与twisted代码运行在同一个上下文,某个回调函数中阻塞,会导致reactor整个事件循环阻塞;reactor会一直运行,除非通过reactor.stop()显示停止它,但一般调用reactor.stop(),也就意味着应用程序结束;

二. twisted简单使用twisted的本质是reactor,我们可以使用twisted的底层API(避开twisted便利的高层抽象)来使用reactor:

示例一可以很清晰的看到twisted的reactor本质:添加监听描述符,监听可读/可写事件,当事件来临时回调函数,回调完成之后继续监听事件。需要注意:套接字为非阻塞,如果为阻塞则失去了reactor的意义我们通过继承IReadDescriptor来提供reactor所需要的接口通过reactor.addReader将套接字类加入reactor的监听对象中main.CONNECTION_LOST是twisted预定义的值,通过这些值它我们可以一定程度控制下一步回调(类似于模拟一个事件)但是上面的MySocket类不够好,主要有以下缺点:需要我们自己去读取数据,而不是框架帮我们读好,并处理异常网络IO和数据处理混为一块,没有剥离开来

三. twisted抽象twisted在reactor的基础上,建立了更高的抽象,对一个网络连接而言,twisted建立了如下三个概念:Transports:网络连接层,仅负责网络连接和读/写字节数据Protocols: 协议层,服务业务相关的网络协议,将字节流转换成应用所需数据Protocol Factories:协议工厂,负责创建Protocols,每个网络连接都有一个Protocols对象(因为要保存协议解析状态)twisted的这些概念和erlang中的ranch网络框架很像,ranch框架也抽象了Transports和Protocols概念,在有新的网络连接时,ranch自动创建Transports和Protocols,其中Protocols由用户在启动ranch时传入,是一个实现了ranch_protocol behaviour的模块,Protocols初始化时,会收到该连接对应的Transports,如此我们可以在Protocols中处理字节流数据,按照我们的协议解析并处理数据。同时可通过Transports来发送数据(ranch已经帮你读取了字节流数据了)。和ranch类似,twisted也会在新连接到达时创建Protocols并且将Transport传入,twisted会帮我们读取字节流数据,我们只需在dataReceived(self, data)接口中处理字节流数据即可。此时的twisted在网络IO上可以算是真正的异步了,它帮我们处理了网络IO和可能遇到的异常,并且将网络IO和数据处理剥离开来,抽象为Transports和Protocols,提高了程序的清晰性和健壮性。

剖析Python的Twisted框架的核心特性(twist python)

示例二要比示例一要简单清晰很多,因为它无需处理网络IO,并且逻辑上更为清晰,实际上ClientFactory和Protocol提供了更多的接口用于实现更灵活强大的逻辑控制,具体的接口可参见twisted源代码。

四. twisted Deferredtwisted Deferred对象用于解决这样的问题:有时候我们需要在ProtocolsFactory中嵌入自己的回调,以便Protocols中发生某个事件(如所有Protocols都处理完成)时,回调我们指定的函数(如TaskFinished)。如果我们自己来实现回调,需要处理几个问题:如何区分回调的正确返回和错误返回&#;(我们在使用异步调用时,要尤其注意错误返回的重要性)如果我们的正确返回和错误返回都需要执行一个公共函数(如关闭连接)呢&#;如果保证该回调只被调用一次&#;Deferred对象便用于解决这种问题,它提供两个回调链,分别对应于正确返回和错误返回,在正确返回或错误返回时,它会依次调用对应链中的函数,并且保证回调的唯一性。

twisted的defer是异步的一种变现方式,可以这么理解,他和thread的区别是,他是基于时间event的。有了deferred,即可对任务的执行进行管理控制。防止程序的运行,由于等待某项任务的完成而陷入阻塞停滞,提高整体运行的效率。Deferred能帮助你编写异步代码,但并不是为自动生成异步或无阻塞的代码!要想将一个同步函数编程异步函数,必须在函数中返回Deferred并正确注册回调。

五.综合示例

下面的例子,你们自己跑跑,我上面说的都是一些个零散的例子,大家对照下面完整的,走一遍。 twisted理解其实却是有点麻烦,大家只要知道他是基于事件的后,慢慢理解就行了。

Java Web开发过程中登陆模块的验证码的实现方式总结 验证码及它的作用验证码为全自动区分计算机和人类的图灵测试的缩写,是一种区分用户是计算机的公共全自动程序,这个问题可以由计算机生成并评判,

Windows下python2.7.8安装图文教程 本文为大家分享了python2.7.8安装图文教程,供大家参考,具体内容如下1、进入python的官方网站下载:

Python程序中的观察者模式结构编写示例 察者模式定义定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖都会收到通知并自动更新。观察者模式提供了一种对象

标签: twist python

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

上一篇:实例解析Python的Twisted框架中Deferred对象的用法(python程序解读举例)

下一篇:Java Web开发过程中登陆模块的验证码的实现方式总结(java web开发流程)

  • 筹建期间的会计分录
  • 本期收入和本期免税收入有什么区别
  • 我国采用的税率形式有哪几种
  • 买充值卡可以开票吗
  • 工业企业提供劳务收入属于什么收入
  • 资产负债表不平衡如何查找
  • 外籍人员可以在中国工作吗
  • 盘盈的固定资产怎么做账务处理
  • 税务师考试的报名费怎么还没有退成功
  • 增值税发票是真发票,但是平台查验不到
  • 虚拟货币会计分录
  • 2019小规模纳税人税率
  • 行政事业单位房产税免征文件
  • 为了贷款支付的土地评估费用怎么会计处理?
  • 发票对方认证不了怎么回事
  • 管理服务费入什么科目
  • 广告喷绘增值税怎么算
  • 附加税税率计税依据
  • 烟草企业发生的广告和宣传费在当年营业收入15
  • 税控机减免会计分录
  • 民办非企业缴纳失业保险吗
  • 持续经营净利润和扣非净利润
  • 纺织厂收购棉花如何计税?
  • 红字增值税专用发票是什么
  • php写接口实现json文件读取
  • ThinkPHP中SHOW_RUN_TIME不能正常显示运行时间的解决方法 原创
  • dgservice.exe是什么文件
  • 企业补充养老保险
  • staruml教程
  • 稀有品种茅膏菜
  • php5.4升级到php7
  • 未开票收入开票
  • 设置pin是什么意思
  • 文化传媒公司的部门
  • 房产税和土地使用税什么时候申报
  • jsonp解决跨域问题spring3.0
  • php收发邮件
  • diffusion扩散模型训练时间
  • dpkg命令详解
  • 原始凭证一般没有
  • 上个月的发票未上传成功可以删除吗
  • 所有者权益合计怎么算
  • 公司购买黄金送客户可以取得进项抵税吗
  • phpcms api
  • dedecms配置
  • 自然人股东原价转让股权
  • 公司帐户转到法人私卡备用金行吗
  • 未开票收入缴纳增值税怎么冲减补开发票
  • 小规模代开增值税专用发票怎么操作?
  • 行政单位要不要税号?
  • 资产减值损失借贷方向
  • 会计核算以什么为主
  • 公司借款给个人400万合法吗
  • 委托收款背书和质押背书都属于转让背书
  • 非营利性代收代缴税款
  • 农民工工资从专户里发放工资需要甲方盖章吗
  • 装修费用摊销计入什么科目
  • 购入商品货款尚未支付
  • 公司向股东借款多久必须归还
  • sqlserver排序规则怎么看
  • mysql批量更新多条数据
  • win7每次开机选系统
  • mac 活动监视器在哪里
  • ConquerCam.exe进程的详细介绍 ConquerCam进程信息介绍
  • Mac借助其他电脑做系统
  • 在linux 上使用QQ聊天程序
  • 电脑出现win 7 界面 然后就不动了
  • 任务栏图标右键
  • windows xp能装微信吗
  • 新装win8系统卡顿严重,虚拟内存为0
  • 如何深度理解
  • PHP+MySQL+jQuery随意拖动层并即时保存拖动位置实例讲解
  • main报错
  • 安卓开源部分叫什么
  • 游戏开发之二维码怎么弄
  • js中不同的height, top的区别对比
  • nodejs如何使用
  • jquery的筛选
  • viewpager自动滑动
  • 什么是增值税一般纳税人证明
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设