以前写了篇关于call仍是cast的讨论,实际等要改为call的时候又发生了疑问。socket
由于call的确有以下做用:测试
1. 阻塞客户端server
2. 有返回值能肯定操做是否成功,并能很好的支持测试游戏
3. 保证时序,只有call成功了,才能继续执行下一步进程
但是除此以外,还有其余好处吗?麻烦呢?文档
若是table_server 只是为一个玩家所用,那么多是合适的。io
惋惜不是,table_server 还须要广播信息,而这部分广播信息不可能放在玩家进程作,table
这样若是在调用端和被调用端都发消息,就有点冗余。ast
cast 是丢过去无论,有返回天然收到,没有返回的话,对不起你本身看着办重试(看起来更流畅?)bug
若是call timeout了,call调用的时候,到底该怎么处理?
告诉用户处理失败? 后续收到该处理的操做完成又该怎么告诉用户?
按照GenServer的文档说明,调用者要么崩溃保持干净,
要么就是try catch,并丢弃那些垃圾信息。
胡言乱语,我仍是决定应用call,而且广播消息只在桌子进程统一发。
最终还整理了simple_table的测试,以及修正Application.start(GameServer) 为 Application.start(:game_server) 的bug。
暂时到这里了,一成天都在思考call 和cast,以及思考测试的问题,搞得很疲劳。
如今TableServer没什么好测试的,若是像SimpleTable那样去测试,实在显得冗余?
若是不测,又感受不是很可靠的样子(曾经的elixir项目我是测进程的),也许是第一次采用这种测试分解方法,还不习惯吧。
代码已经发布,后续接着:
添加不翻牌、不补牌的操做加速牌局
添加玩家的操做
以及补充测试
=====================================新的想法=============================
call 大抵适用于那种call期间无需处理其余事情的调用。
像游戏这种,一般中间会有其余消息须要处理,这时候为了及时处理更新,call可能就不合适了。
我想这大概就是你们用cast的最大缘由。
引伸开来,若是连cast都显得缓慢,那可能又须要直接对socket发操做了(固然这是最后选择)。
我代码就保持call不改了(棋牌可能影响不大),我也懒得改,这个系列主要是探讨总结用的。