异步

我以前很排斥异步调用,一看到异步调用就觉得特别扭:同步调用多好,一步步地执行,一异步程序的运行顺序不大直观。可是近段时间有了新的体会,觉得有时异步真有它的好处。记下来,作个备忘。

         先要说说那个让我觉得非得用异步调用不行的场景吧。这涉及到Command模式,为了对一个业务逻辑建模我写了一大堆Command,并把这此Command加到一个队列中。每次从这个队列中取出一个来执行。类图如下:

 

 

Continue函数的实现看起来像这样:

 

        m_pCurCommand= m_queueCommands.Dequeue();

         if(NULL!= m_ pCurCommand)

         {

                   m_pCurCommand->Execute();                          //(1)

                 ……..

                   m_pCurCommand->Other();                               //(2)

         }

现在问题来了,因为某个Command的Execute方法有点复杂,对它的调用引发了CommandQueue的Continue的另一次执行, 而恰好这个Command在某些情况下是最后一个Command。这样第一次执行Continue时,刚执行到(1),这时Continue开始第二次执 行,并将m_pCurCommand设为了NULL,返回。第一个Continue继续,运行到(2)时,程序挂掉了!!!

 

        也许有的人会说你用个局部变量代替m_pCurCommand不好了,不幸的是。我有可能需要在外部查询当前正在执行的命令。

 

所以在这里我用上了异步调用。方法很简单我把这个Continue的实现弄成了异步,也就是说Continue会直接返回,在返回之前会将一个help function : _Continue加到一个计时器中,让_Continue在一定时间之后再执行。如下:

Void Continue()

{

         AddTimer(_Continue,1000);    //execute after 1 seconds

}

而_Continue的实现完全是将早先Continue的实现剪切下来的。

 

 

这个场景对大家来说可能不好理解,一个更通常的场景是 Socket 和客户端 Client:

 

在Client的OnRead中会调用Socket中的Read方法,Read成功的时候会返回Read到了多少数据。但是也可能会失败,失败时 Socket会调用OnError。这样,如果在Client的OnError的实现中作了某些清理工作,当Read继续运行就可能会挂!!fix方法就 是殷OnError弄成异步的。

 

 

 

Notice: 如果在异步调用中要传递指针,这个指针最好是个智能指针,因为你是异步,在你还没有执行的时候,那个指针可能在别的地方被人给delete了。

内容概要:本文档是一份关于大数据开发的笔试题目集合,涵盖了多个计算机科学领域的知识点。主要内容包括:数组排序算法的应用,如给出了一段不完整的冒泡排序代码示例;二叉树的基本操作,包括普通二叉树的遍历方式(先序遍历),以及针对大规模数据(如一亿个节点)时避免服务器崩溃的优化策略——采用分布式计算思想将单棵大树拆分为多棵小树并行处理;人力资源系统的数据库设计方案,涉及到了员工信息存储所需的字段(如ID、姓名、工资、上级ID、层级)、展示公司内部架构的SQL语句(利用CTE公共表达式或者PL/SQL中的特定语法来构建递归查询),还有统计某个管理者所辖人数的方法论。 适合人群:正在准备大数据相关岗位面试的技术人员,尤其是那些希望加深对数据结构、算法以及数据库设计等方面理解的人群。 使用场景及目标:①帮助求职者熟悉常见的编程技巧与理论知识,提高解决实际问题的能力;②为从事企业级应用开发工作的程序员提供参考案例,以便更好地理解和实施复杂的数据管理和业务逻辑建模任务。 阅读建议:由于文档中包含了多种类型的题目,建议读者按照自己的薄弱环节选择重点复习的内容。对于排序算法部分,应该注意理解各种经典算法的工作机制及其优缺点;对于二叉树的问题,则要掌握不同遍历顺序的特点,并思考如何应对海量数据带来的挑战;最后,在研究HR系统相关的数据库设计时,除了要学会正确地创建表格外,还应学会运用适当的SQL语句来进行高效的数据检索和分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值