一、介绍
在前面对同步和异步的概念以及相关的开发情况进行过分析。本文将侧重于从设计的角度来对它们进行分析和说明。设计来源于生活,又指导着人们在生活中的实践。不光计算机技术如此,其它的情况下也是如此。
二、同步和异步
所谓同步和异步,特别是异步,大家不要想的多么的高大上。只是不同的场景下的应用罢了。正如萝卜白菜,各有所爱,一个道理。比如大家在看到阅兵时,看到整齐的步伐、一致的口号和敬礼,这其实就是一种同步。令之所至,大家同时做并且同时完成一件事,这就是同步。大家也在网上看到过其它国家的阅兵,特别是一些南亚的国家,就是你走你的,我走我的,主打一个不一致,不协调,可最后人家阅兵的活动也正常完成了啊,这就叫异步。到于具体到哪个情况更好,这个没有绝对的标准。
这就回到了经常提到的解决问题的方式,哪种方法更适合于自己的开发的实际情况就使用哪种方法。而这就涉及到了非常多的条件,比如刚刚提到的阅兵,就涉及到了历史延革、民族风俗、阅兵的目的和军队具体作用等等。
同样,在实际的开发过程中,同步好还是异步好,这不取决于某个单纯的条件。有可能同步方便实现,那先采用同步实现,等以后再进行异步升级。也有可能异步效率高,提供更高的并发支持,所以用异步实现,而放弃同步。也有可能两者同时使用,达到一个在限定时间内的限定功能的基本满意。
三、二者的应用
同步和异步一般多应用在线程或进程中,当然,某些类似这些应用的场景也都可以使用。下面将对其进行分别的说明:
1、同步应用场景
1)简单和测试应用
一般来说,相对简单的应用,引入异步是自讨苦吃。而为达到某个目的做的原型或相关测试为了节省工作量,一般也是使用同步
2)强一致流程
也可以称之为原子流程,即立刻响应,不中断流程情况下完成相关任务
3)对同步问题不敏感或业务流程本身即为同步的应用
这种情况很多,比如用户的交互操作、游戏的回合执行等等。
4)特殊场景
比如一些特定的嵌入式场景或用户指定的必须同步的情况
2、异步应用场景
1)IO密集型应用
这种属于最典型的应用,比如网络通信,是最常见的例子,前面分析过的IOCP,EPOLL等等都属于此类
2)响应操作中的长耗时场景
这是异步应用的又一个常见场景,比如生产者生产了一个数据,消费者需要较长时间才能把计算结果返回给生产者,那么此时就是异步的最佳应用
3)高并发应用
这个就更常见了,比如聊天常用的微信以及消息的推送
4)设计架构的应用
这个其实也比较多,某些设计模式、事件驱动、消息驱动以及定时处理等,都离不开异步应用
一般来说,同步更强调的是流程的协调,即每个节点必须一步步来,否则这个流程就不能正常的完成。可以理解为前后条件的互相依赖。这才是同步和异步的最关键的不同这处。
四、实现
同步和异步实现的机制不同,所以其实现方式也有所不同。同步的实现机制主要有:
1、使用同步原语
其实就是经常提到的锁机制,包括种互斥体、信号灯以及条件变量、事件等等。这种都可以达到同步的目的
2、阻塞操作
这种天然的实现了同步的操作,必须等待操作完成才会进行下一步。比如IO的阻塞、业务流程的阻塞等等,还有常见的一些阻塞式的数据结构都是如此
异步的实现机制主要有:
1、中断调用
这种基于硬件的中断或类似于这种中断的都可以实现异步的调用
2、事件系统和消息机制
事件和线程一起用来实现异步调用,是非常经典的例子;同样消息也是解耦行为实现异步的一个重要机制
3、多线程+回调
这是广大开发者接触到的最常见的异步实现
4、协程
这个不做过多解释,毕竟协程还没有被完全推广开来。
同步和异步并不是象大家想象的那样必须旗帜鲜明的区别开来,很多情况下,往往都是哥俩一起上,解决问题才是王道,不要盲目陷入类似武侠小说里的正邪之分的斗争中去。
五、总结
同步的异步的例子前面举得太多了,有简单的也有复杂的,开发者自己估计也经常见到。异步应用的麻烦之处在于处理结果的一致性,这就需要开发者从一开始就要有一个整体上的异步控制流程机制,保证数据在异步的情况下的完整性和安全性。这也是异步开发的复杂性所在。
从设计上考虑,对于同步和异步的应用,不是非此即彼的,只要能搞定工作,怎么简单怎么来。
358



被折叠的 条评论
为什么被折叠?



