[教程]ZAsync 异步编程之三:我们对异步编程的一些观点

异步编程对于开发人员来说,实际上是一个又爱又恨的东西,用好了很舒服,用不好很麻烦。异步编程中,异步操作代码的本身是在一个后台线程或当前线程中延迟调用。而大家说异步编程的几种不同的处理方式,实际上是指对异步处理完成后,如何处理后续的步骤,本质上都是回调处理函数,但操作各有不同:

  • 直接设置回调函数
  • 订阅机制:订阅异步作业通知,本质上还是回调函数,只是由一个改为多个,各种所谓的 observers 归于此类
  • 链式调用:do(something).then(dosomething1) 这种模式,实际上还是回调的语法糖
  • 事件响应:事件响应函数本身就是一个回调,同样归到此类
  • async/await:高级糖果,必需承认,这种机制的优势在于原线程原语义,代码的执行在原来的线程空闲时间片执行。它追求的不是并发,而是充分利用线程的空闲资源。async/await 的实现,因为要在原线程执行,所以就要求原来的线程不能死掉,否则肯定切不回去。而且原来的线程要回调对应的代码执行,必需切换到一种特殊的状态,方式不外乎三种:协程、纤程和 APC 方式,实际上这三种方式没有啥本质的区别,都是线程进入空闲时,调用相应的处理代码。当对应的代码执行完或进入等待状态时,去调用下一个处理代码。本质上,仍是记录各个处理函数代码的位置,然后调用原来的函数,所以我们可以认为它是一种特殊的回调。

对于 ZAsync 来说,我们关注的是异步编程本身,而不是怎么通知结果。

  • 异步操作要在主线程还是在后台线程中执行?
  • 异步操作是否需要延迟执行?
  • 多个异步操作之间是什么关系?并发还是串行?
  • 怎么保证异步编程中资源的有效性?
  • 是否有必要在当前线程中延迟调用对应的异步操作?事实上,如果采用 async 模式,几乎必然能支持 await 模式,只是我们是否有必要支持?

ZAsync 将试图一一解答这些问题。

[注意]

1、不要因为 async 模式是在当前线程中执行,不需要进行锁而掉以轻心。在有多个异步对上一级作用域的变量的访问时,尤其注意。当一个异步作业的代码交出控制权后,另一个可能会改变上级作用域变量的值,应尽量避免这种情况。

2、async/await 依赖于当前线程的存在,如果当前线程异常中止退出,则会造成后续的代码没法正常执行。

分享到: