博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
采用用同步编程的方式实现跨进程异步获取数据
阅读量:5265 次
发布时间:2019-06-14

本文共 2238 字,大约阅读时间需要 7 分钟。

转载请注明:

异步获取数据,我这边采用了一点点小技巧,这样异步获取数据的操作,变成和同步操作一样自然。

这个我个人得静下心来,好好地梳理一下,过个半个月遇到类似的需求,我自己都忘记是怎么处理了。处理方式比较有意思。

遇到一些常见的异步操作的业务逻辑:

[1] 角色登录请求,发现内存中没有该角色数据,从远程的缓存或者DB读取该角色数据。

[2] 获取某个角色信息,发现这个角色信息目前不在线,这时候,也从远程的缓存或者db读取该角色数据。

[3] 判断这个家伙是否是另外一个玩家的好友,sns类游戏中,这类逻辑超多。

我们先把直接做法,简单列出来,用来和另外一种比较优雅的方式做比较。

术语定义:

Juge_Friend_Req  

         判断是否是好友的请求,发向好友服务器。

Juge_Friend_Res

         从好友服务器回来。

Add_Energy_Req

        从Client发过来的加能量的请求。

以[3]为例子,当然,好友服务器和主逻辑服务器是位于两个进程中,如果一个进程中,那没什么好说的。比如,给好友加能量,借好友宠物上场战斗。

 

void AddEnergyReq(roleId1, roleId2){    // 向好友服务器发出判断是否是好友的请求    JudgeFriendReq(roleId1, roleId2, kFriendBehaviorTypeAddEnergy); }void BorrowPetReq(roleId1, roleId2, petId){    JudgeFriendReq(roleId1, roleId2, kFriendBehaviorTypeBorrowPet); }// 从好友服务器回来判断是否是好友的回应void JudgeFriendRes(msg){    switch (msg.operType)    {    case kFriendBehaviorTypeAddEnergy:        AddEnergy(msg.xxx);        break;    case kFriendBehaviorTypeBorrowPet:        BorrowPet(msg.xxx);        break;    }}

从好友服务器回来的回应,以后有和好友判断相关的逻辑,会继续加新的业务分支。

 

这代码比较恶心,我们目标是,判断好友的回应回来后,我们的流程能继续回到各自请求的处理逻辑里去!从我们写代码的角度,就好像没有发生过异步请求。

我就记录一下,我们这边的处理方法。针对Add_Energe_Req的处理:

[1] 发出Judge_Friend_Req的时,把请求消息的内容,作为透传数据,发给好友服务器,然后就还回来,[4]用到。

[2] 引入一个附加参数,void* param,每个请求,各自转化自己的数据类型(这个描述不清楚)。

[3] 好友服务器回来消息,将消息分发给JudgeFriendRes的时候,设置上面那个param。

[4] 在Judge_Friend_Req时,有Add_Energe_Req的数据,想办法再一次分发Add_Energe_Req,重走一回AddEnergeReq流程。

发出好友请求和处理逻辑,两者是在一起的。

 

void AddEnergyReq(msgReq, const Param* param){    if (!param)   // param如果是nullptr, 还没有发过判断好友请求        // 向好友服务器发出判断是否是好友的请求        JudgeFriendReq(msgReq.roleId1, msgReq.roleId2, msgReq);     else    {        bool isFriend = (bool)param;        if (isFriend)            AddEnergy(...);    }}

 

发判断好友请求时,msgReq设置成透传;根据param是否是nullptr来判定是否已经发过Judge_Friend_Req。

如果借用宠物的逻辑,和这个类似,各自写自己的逻辑。

Judge_Friend_Res回来时,做的工作。先在网络消息的分发的时候,做一些手脚,设置附加参数。

 

void MsgDispatch(buf, len){    ssMsg = ParseSSMsg(buf, len);    DispatchSS(ssMsg, param);      // 走到JudgeFriendRes    csMsg = ssMsg.msgReq;    DispatchCS(csMsg, param);      // 走到AddEnergyReq}

 

在JugdeFriendRes里,设置param

 

void JudgeFriendRes(ssMsg, param){    param = ssMsg.isFriend;}

 

设置这个参数后,DispatchCS用透传的数据,让流程继续回到AddEnergyReq。当第2次走到AddEnergyReq时,param != nullptr,直接判定是否是好友,接下来做该做的事情。

 

转载于:https://www.cnblogs.com/suncoolcat/p/3323036.html

你可能感兴趣的文章
DirectShow OpenCV GDI+ 图形显示格式转换
查看>>
PHP利用FTP上传文件连接超时之开启被动模式解决方法
查看>>
rdesktop的使用
查看>>
each实现原理
查看>>
requests模块
查看>>
常用的Linux命令
查看>>
POJ 3624 Charm Bracelet
查看>>
php设计模式学习之工厂模式
查看>>
Freemarker 的基础使用 (一)
查看>>
window系统如何安装Git以及Git小乌龟,实现git命令
查看>>
瀑布流
查看>>
lintcode : find peak element 寻找峰值
查看>>
杭电oj平台上的11页题目代码:hdu-page11 (2070~2079)
查看>>
selenium webdriver 通信过程
查看>>
jQuery火箭图标返回顶部代码
查看>>
Python爬虫正则表达式常用符号和方法
查看>>
MYSQL 总结——1
查看>>
通过FTP无法删除文件
查看>>
Wannafly挑战赛1 C MMSet2 虚树
查看>>
Linux进程间通信方式--信号,管道,消息队列,信号量,共享内存
查看>>