为什么使用异步编程

1.1 阻塞

程序未得到所需计算资源时被挂起的状态。

程序在等待某个操作完成期间,自身无法继续干别的事情,则称该程序在该操作上是阻塞的。

常见的阻塞形式有:网络I/O阻塞、磁盘I/O阻塞、用户输入阻塞等。

阻塞是无处不在的,包括CPU切换上下文时,所有的进程都无法真正干事情,它们也会被阻塞。

如果在某程序的运行时,能根据已经执行的指令准确判断它接下来要进行哪个具体操作,那它是同步程序,反之则为异步程序。(无序与有序的区别)

同步/异步、阻塞/非阻塞并非水火不容,要看讨论的程序所处的封装级别。例如购物程序在处理多个用户的浏览请求可以是异步的,而更新库存时必须是同步的。

1.9 异步之难(nán)

控制不住“计几”写的程序,因为其执行顺序不可预料,当下正要发生什么事件不可预料。在并行情况下更为复杂和艰难。

所以,几乎所有的异步框架都将异步编程模型简化:一次只允许处理一个事件。故而有关异步的讨论几乎都集中在了单线程内。

如果某事件处理程序需要长时间执行,所有其他部分都会被阻塞。

所以,一旦采取异步编程,每个异步调用必须“足够小”,不能耗时太久。如何拆分异步任务成了难题。

程序下一步行为往往依赖上一步执行结果,如何知晓上次异步调用已完成并获取结果?

回调(Callback)成了必然选择。那又需要面临“回调地狱”的折磨。

同步代码改为异步代码,必然破坏代码结构。

解决问题的逻辑也要转变,不再是一条路走到黑,需要精心安排异步任务。

多进程问题

https://baijiahao.baidu.com/s?id=1588772261260715350&wfr=spider&for=pc

猜你喜欢

转载自my.oschina.net/ahaoboy/blog/1620767