位置: 编程技术 - 正文

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

编辑:rootadmin

推荐整理分享详解Python的Twisted框架中reactor事件管理器的用法(python traits),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python traits,python twisted,python twinter,python twinter,python twinter,python twisted,python twisted,详解python的垃圾回收机制,内容如对您有帮助,希望把文章链接给更多的朋友!

铺垫在大量的实践中,似乎我们总是通过类似的方式来使用异步编程:

监听事件 事件发生执行对应的回调函数 回调完成(可能产生新的事件添加进监听队列) 回到1,监听事件

因此我们将这样的异步模式称为Reactor模式,例如在iOS开发中的Run Loop概念,实际上非常类似于Reactor loop,主线程的Run Loop监听屏幕UI事件,一旦发生UI事件则执行对应的事件处理代码,还可以通过GCD等方式产生事件至主线程执行。

上图是boost对Reactor模式的描绘,Twisted的设计就是基于这样的Reactor模式,Twisted程序就是在等待事件、处理事件的过程中不断循环。

reactor是Twisted程序中的单例对象。

reactorreactor是事件管理器,用于注册、注销事件,运行事件循环,当事件发生时调用回调函数处理。关于reactor有下面几个结论:

Twisted的reactor只有通过调用reactor.run()来启动。 reactor循环是在其开始的进程中运行,也就是运行在主进程中。 一旦启动,就会一直运行下去。reactor就会在程序的控制下(或者具体在一个启动它的线程的控制下)。 reactor循环并不会消耗任何CPU的资源。 并不需要显式的创建reactor,只需要引入就OK了。

最后一条需要解释清楚。在Twisted中,reactor是Singleton(也就是单例模式),即在一个程序中只能有一个reactor,并且只要你引入它就相应地创建一个。上面引入的方式这是twisted默认使用的方法,当然了,twisted还有其它可以引入reactor的方法。例如,可以使用twisted.internet.pollreactor中的系统调用来poll来代替select方法。

若使用其它的reactor,需要在引入twisted.internet.reactor前安装它。下面是安装pollreactor的方法:

如果你没有安装其它特殊的reactor而引入了twisted.internet.reactor,那么Twisted会根据操作系统安装默认的reactor。正因为如此,习惯性做法不要在最顶层的模块内引入reactor以避免安装默认reactor,而是在你要使用reactor的区域内安装。下面是使用 pollreactor重写上上面的程序:

那么reactor是如何实现单例的?来看一下from twisted.internet import reactor做了哪些事情就并明白了。

下面是twisted/internet/reactor.py的部分代码:

注:Python中所有加载到内存的模块都放在sys.modules,它是一个全局字典。当import一个模块时首先会在这个列表中查找是否已经加载了此模块,如果加载了则只是将模块的名字加入到正在调用import的模块的命名空间中。如果没有加载则从sys.path目录中按照模块名称查找模块文件,找到后将模块载入内存,并加入到sys.modules中,并将名称导入到当前的命名空间中。

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

假如我们是第一次运行from twisted.internet import reactor,因为sys.modules中还没有twisted.internet.reactor,所以会运行reactory.py中的代码,安装默认的reactor。之后,如果导入的话,因为sys.modules中已存在该模块,所以会直接将sys.modules中的twisted.internet.reactor导入到当前命名空间。

default中的install:

很明显,default中会根据平台获取相应的install。Linux下会首先使用epollreactor,如果内核还不支持,就只能使用pollreactor。Mac平台使用pollreactor,windows使用selectreactor。每种install的实现差不多,这里我们抽取selectreactor中的install来看看。

在installReactor中,向sys.modules添加twisted.internet.reactor键,值就是再install中创建的单例reactor。以后要使用reactor,就会导入这个单例了。

implementer表示SelectReactor实现了IReactorFDSet接口的方法,这里用到了zope.interface,它是python中的接口实现,有兴趣的同学可以去看下。

IReactorFDSet接口主要对描述符的获取、添加、删除等操作的方法。这些方法看名字就能知道意思,所以我就没有加注释。

示例中的reactor.listenTCP()注册了一个监听事件,它是父类PosixReactorBase中方法。

整个逻辑很简单,和正常的server端一样,创建套接字、绑定、监听。不同的是将套接字的描述符添加到了reactor的读集合。那么假如有了client连接过来的话,reactor会监控到,然后触发事件处理程序。

reacotr.run()事件主循环

mianLoop就是最终的主循环了,在循环中,调用doIteration方法监控读写描述符的集合,一旦发现有描述符准备好读写,就会调用相应的事件处理程序。

那么假如客户端有连接请求了,就会调用读集合中tcp.Port的doRead方法。

doRead方法中,调用accept产生了用于接收客户端数据的套接字,将套接字与transport绑定,然后把transport加入到reactor的读集合。当客户端有数据到来时,就会调用transport的doRead方法进行数据读取了。

Connection是Server(transport实例的类)的父类,它实现了doRead方法。

_dataReceived中调用了示例中我们自定义的EchoProtocol的dataReceived方法处理数据。

至此,一个简单的流程,从创建监听事件,到接收客户端数据就此结束了。

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

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

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

标签: python traits

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

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

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

  • 哪些进项税额可以抵扣销项税额
  • 申请渠道门户网站是什么意思
  • 个人所得税计提分录怎么写
  • 公司现金账户归谁管
  • 劳动合同和劳务合同有什么区别 举例
  • 资产负债表的其他应付款怎么填列
  • 预收款项增值税
  • 什么产品可视同自产产品享受退税优惠
  • 上市公司限制性股票行权时间限制多久
  • 应收票据周转率多少合适
  • 冲预付账款预算会计怎么做分录
  • 暂估成本跨年后未收到票如何处理
  • 收就业局稳岗补贴做账
  • 企业缴纳社保费一个月多少钱
  • 受托加工费的成本都有什么
  • 有开发票就要交印花税吗?
  • 个人所得税返还奖励财务人员做账
  • 个体工商户个税减免优惠政策
  • 员工一次性赔偿怎么算
  • 机构信用代码证是三证合一里的吗
  • 出口退免税收汇相关业务
  • 交强险是不是只要有发票就可以报销
  • 工程施工纳税
  • 企业财务内部控制的主要内容有哪些
  • 公司邀请外国人来华邀请函模板
  • 股东退股会计科目
  • 外卖收入增值税怎么算
  • 残保金减免如何做账
  • 文件类型有几种分类
  • 房产契税征收率
  • 计提工资的时候是应发合计还是实发合计
  • 补缴社保公积金申请书怎么写
  • 其他业务收入借贷方向
  • 职工薪酬纳税调整明细表怎么填写
  • 发票点击了打印,然后怎么修改
  • 专票如何申领
  • 微信小程序怎么制作自己的小程序
  • angular 初学者快速上手教程
  • 自动驾驶数据集 mev
  • 时间格式转换成小时数
  • 预付账款和预收账款哪个是负债
  • 购置固定资产支付的现金属于投资活动产生的现金流量吗
  • phpcms使用教程
  • mongodb性能优化方案有哪些?
  • 财务负责人和法人可以一个人吗
  • 用友会计科目增加二级
  • 新办企业发票核定及申领
  • 更正个税申报需要交滞纳金没
  • 保险公司给员工奖励是违法的吗
  • 企业所得税季度申报表营业收入怎么填写
  • 专票认证之后怎么做账
  • 城镇土地使用税征收标准及计算方法
  • 个人所得税如何计算
  • 实收资本为零该怎么办
  • 以股权入资该怎么办
  • 固定资产清理后折旧怎么处理
  • 企业变更地址需要几天
  • 开出银行承兑汇票一张用于支付材料采购款
  • 年终奖财务是以工资形势发放,个税怎么单独计税
  • 年度投资额看哪个科目
  • 税控盘没有反写会罚款吗
  • 老板用公司的钱算挪用公款吗
  • 应收账款和应付账款属于什么科目
  • win7登录设置
  • VISTA 下如何通过红外线连接外接设备 以索尼手机为例
  • txt文件打开
  • win7开机提示音在哪里关闭
  • win10系统怎么设置开机密码
  • opengl画矩形函数
  • c/s模式的例子
  • node.js详解
  • 批处理之家官网
  • axios原理和实现
  • shell脚本 su
  • 八大排序算法的时间空间复杂度
  • 理解Python中的变量
  • javascript例题
  • python深入浅出
  • 国税系统升级后怎么添加办税人
  • 新版ukey税盘怎么设置密码
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设