位置: 编程技术 - 正文

基于python yield机制的异步操作同步化编程模型(基于python的应用)

编辑:rootadmin

推荐整理分享基于python yield机制的异步操作同步化编程模型(基于python的应用),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:基于python的系统,基于python的设计,利用python,基于python的设计,基于python的研究,基于python的研究,基于python的研究,基于python语言,内容如对您有帮助,希望把文章链接给更多的朋友!

本文总结下如何在编写python代码时对异步操作进行同步化模拟,从而提高代码的可读性和可扩展性。

游戏引擎一般都采用分布式框架,通过一定的策略来均衡服务器集群的资源负载,从而保证服务器运算的高并发性和CPU高利用率,最终提高游戏的性能和负载。由于引擎的逻辑层调用是非抢占式的,服务器之间都是通过异步调用来进行通讯,导致游戏逻辑无法同步执行,所以在代码层不得不人为地添加很多回调函数,使一个原本完整的功能碎片化地分布在各个回调函数中。

异步逻辑

以游戏中的副本评分逻辑为例,在副本结束时副本管理进程需要收集副本中每个玩家的战斗信息,再结合管理进程内部的统计信息最终给出一个副本评分,发放相应奖励。因为每个玩家实体都随机分布在不同进程中,所以管理进程需要通过异步调用来获取玩家身上的战斗信息。

实现代码如下所示:

代码简化了副本评分逻辑的实现,其中Player类表示游戏的玩家实体,在游戏运行时无缝地在不同服务器中切换,FubenStub表示副本的管理进程,在副本刚开始的时候该副本内所有玩家会将自己的MailBox注册到管理进程中,其中MailBox表示各个实体的远程调用句柄。在副本结束时,FubenStub首先向各个玩家发送副本结束消息,同时请求玩家的战斗信息,玩家在得到消息后,将自己的战斗信息发送给FubenStub;然后当FubenStub收集完所有玩家的信息后,最终打印副本评分。

同步逻辑

如果Player和FubenStub在同一进程中的话,那所有的操作都可以同步完成,在FubenStub向玩家发送副本结束消息的同时可以马上得到该玩家的战斗信息,实现代码如下所示:

从以上两份代码可以看到由于异步操作,FubenStub中的评分逻辑人为地分成两个功能点:1)向玩家发送副本结束消息;2)接受玩家的战斗信息;并且两个功能点分布在两个不同的函数中。如果游戏逻辑一旦复杂,势必会造成功能点分散,出现过多onXXX异步回调函数,最终导致代码的开发成本和维护成本提高,可读性和可扩展性下降。

如果有一种方法,可以让函数在异步调用时暂时挂起,并且在回调函数得到返回值后恢复执行,那么就可以用同步化的编程模式开发异步逻辑。

yield 关键字

yield 是 Python中的一个关键字,凡是函数体中出现了 yield 关键字, Python将改变整个函数的上下文,调用该函数不再返回值, 而是一个生成器对象。只有调用这个生成器的迭代函数next才能开始执行生成器对象,当生成器对象执行到包含 yield 表达式时, 函数将暂时挂起,等待下一次next调用来恢复执行,具体机制如下:

1)调用生成器对象的next方法,启动函数执行;

2)当生成器对象执行到包含 yield 表达式时, 函数挂起;

3)下一次 next 函数调用又会驱动该生成器对象继续执行此后的语句, 直到遇见下一个 yield 再次挂起;

4)如果某次 next 调用驱动了生成器继续执行, 而此后函数正常结束,生成器会抛出 StopIteration 异常;

如下代码所示:

执行结果为:

Before first next

Before first yield

基于python yield机制的异步操作同步化编程模型(基于python的应用)

Before second next

Before second yield

Before third yield

After second yield

StopIteration

哈,有了让函数暂时挂起的机制,最后就剩下如何传递异步调用的返回值问题了。其实生成器的next函数已经实现了将参数从生成器对象内部向外传递的机制,并且python还提供了一个send函数将参数从外向生成器对象内部传递的机制,具体机制如下:

1) 调用next 函数驱动生成器时, next会同时等待生成器中下一个 yield 挂起,并将该yield后面的参数返回给next;

2)往生成器中传递参数,需要将next函数替换成send,此时send的功能与next相同(驱动生成器执行,等待返回值),同时send将后面的参数传递给生成器内部之前挂起的yield;

如下代码所示:

执行结果为:

generator outer receive: first yield msg

generator inner receive: first send msg

generator outer receive: second yield msg

generator inner receive: second send msg

StopIteration

同步化实现

好了,万事俱备只欠东风,下面就是简单对yield机制进行工程上封装以方便之后开发。下面的代码提供了一个叫IFakeSyncCall的interface,所有包含异步操作的逻辑类都可以继承这个接口:

其中interface中属性generators用来保存类中已经开始执行的生成器对象;函数FAKE_SYNCALL是一个decorator,装饰类中包含有yield的函数,改变函数的调用上下文,在fakeSyncCall内部封装了对生成器对象的next调用;函数onFakeSyncCall封装了所有onXXX函数的逻辑,其他实体通过调用这个函数传递异步回调的返回值。

下面就是经过同步化改进后的异步副本评分逻辑代码:

比较evalFubenScore函数,基本已经和原本的同步逻辑代码相差无几。

利用yield机制实现同步化编程模型的另外一个优点是可以保证所有异步调用的逻辑串行化,从而保证数据的一致性和有效性,特别是在各种异步初始化流程中可以摒弃传统的timer sleep机制,从源头上扼杀一些隐藏很深的由于数据不一致性所导致的bug。

python正则表达式之作业计算器 作业:计算器开发实现加减乘除及拓号优先级解析用户输入1-2*((-+(-/5)*(9-2*5/3+7/3*/4*+*/))-(-4*3)/(-3*2))等类似公式后,必须自己解析里面的(),

浅析Python编写函数装饰器 编写函数装饰器本节主要介绍编写函数装饰器的相关内容。跟踪调用如下代码定义并应用一个函数装饰器,来统计对装饰的函数的调用次数,并且针对

浅析Python基础-流程控制 Python编程语言的作用非常强大,而且其应用方便的特点也对开发人员起到了非常大的作用。在这里我们就可以先从Python流程控制关键字的相关概念开始

标签: 基于python的应用

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

上一篇:理解Python中的With语句(理解Python中的变量)

下一篇:浅析Python编写函数装饰器(python怎么编函数)

  • 金融资产交易增值税
  • 税务安全组件初审流程
  • 减免所得税会影响工资发放吗
  • 关税完税价格计算消费税公式
  • 增值税纳税申报表在哪里打印
  • 会计工资标准
  • 企业管理费可以扣除吗
  • 个税申报收入额怎么填
  • 怎么控制成本费用餐厅
  • 作为福利手段福利概念的三个条件是
  • 负数发票跨月怎么重开
  • 打官司赢了再付费叫什么
  • 农民合作社缴附加税吗
  • 支付的劳务派遣费计入什么科目里
  • 个体户国税异常怎么办
  • 作废的发票怎么复制开新票
  • 营改增怎么抵扣
  • 金税盘里的增值税怎么算
  • 以现金形式发放的员工餐费补贴,可并入职工福利费
  • 行政单位库存物资管理办法
  • 应向客户收取的出租包装物租金
  • 电子发票逾期未报税怎么办
  • 广告费发票收到但是不抵扣怎么做账?
  • 汇票和本票之间在使用上有什么差别
  • 权益乘数公式
  • 直接转让土地使用权 土地增值税申报表
  • 消费税的计算公式推导过程
  • 库存商品的核算方法
  • 收到对方公司的货款怎么记账
  • win10 20h2更新后闪屏
  • 认证超时什么意思
  • win10怎么关掉
  • php判断https
  • 土地投资入股是否缴纳土地增值税12366
  • 增值税已认证抵扣
  • win10电脑记事本在哪
  • php怎么与mysql连接
  • PHP:mcrypt_enc_get_supported_key_sizes()的用法_Mcrypt函数
  • 社会保险费缓缴政策
  • phpunicode
  • 企业收到对外投资收益交所得税吗
  • 处理固定资产时的账务处理
  • 筹建期间的开办费为什么不属于资产
  • 新闻发布管理系统
  • vue脚手架和vue的区别
  • vue项目安装路由
  • 网站禁止了有什么方法打开
  • spring ioc di aop
  • element-ui tree 异步树实现勾选自动展开、指定展开、指定勾选
  • 借款合同按什么缴纳印花税
  • 个税赡养老人作废后无法修改
  • 实收资本可以用于偿还借款
  • 四联收据每一联用途
  • 小规模纳税人怎么开专票
  • 出口的进项发票认证后要确认吗
  • 资产减值损失如何计提
  • 2021年财务新规定
  • 房地产增值税发票是什么意思
  • 住宿费记入成本会计分录
  • 暂估出口收入如何计算
  • 会计科目的设置原则包括( )
  • 期初数据根据总账还是明细账
  • 什么是合法有效的继承证明
  • mysql登录失败处理
  • 传统与现代的结合英文
  • xp系统怎么修改图标和文字大小
  • ubuntu root账户默认密码
  • windows的批处理是如何实现的
  • Linux系统安全性体现在哪些方面?
  • win8搜索不到自己家的WiFi
  • Win10系统如何使用虚拟光驱加载ISO镜像文件?
  • win10更新提示错误
  • js浏览器打印
  • Unity3d OnApplicationPause与OnApplicationFocus 判断游戏暂停还是重新启动
  • 变量赋值的含义
  • 基于javascript的论文题目
  • shell 查找文件并赋值shell变量
  • 黑龙江电子税务局
  • 如何做好税务党建工作
  • 个人所得税小孩上大学可以扣除吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设