2021年05月06日

异步、协程是怎么回事,如何写高性能异步代码?

先不讲“异步”、“协程”是什么……

为什么不讲呢,因为其实这些概念想解决的主要问题是:让 Worker 得到充分利用,避免在明明有事可以做的时候它却在等待状态。

做事的时候避免没必要的等待,这种优化工作效率的方式在现实中也是很普遍的。

比如让 Worker A 做一件事:(1) -> (2) -> (3) -> (4)。他依次把这些步骤全做完,这时效率就很高了,他没有做一点无关的事,也没有做什么无用的等待。

如果步骤 (2) 是 A 做不了的,需要交给其他人去做,那 A 就只能等别人做完了。如果 A 在等待的过程中什么事也不做,那么他的效率就是没被充分利用的,如果此时 A 先去忙其它的事,等步骤 (2) 被完成了再回来做这件事,那就不会有无用的等待了。

所以,A 高效的做事方式是:

  1. A 有多件事可以做;
  2. A 遇到应由别人做的步骤时,交给别人去做。A 去做其它可以做的事;
  3. 当某件事的某个步骤由别人做完了,那么 A 就可以继续做这件事了。

那么在编程上,如何写这种高效的代码呢?按照最直接的方式,肯定是不能满足要求的:

(1);
(2);
(3);
(4);

因为这样写 A 就是要干等着直到 (2) 被别人完成了。

可以这样写:

(1);
Other(2);
(3);
(4);

这样 A 就可以把 (2) 丢给别人,自己去忙其它的事了!

这时候当然也是需要别人配合的,就是在完成了 (2) 之后,要记下来,让 A 可以知道他能够继续做那件事了。

同时呢,A 也要知道自己有哪些事可以做、哪些事要等别人做完了再继续做。

延伸讨论

如果有件事很重要,别人完成了 (2) 之后 A 应该立即去继续做,那该咋办呢?那在 (2) 被完成的时候,直接把 A 拉过来继续做就好了。

如果有件事很重要很重要,一点时间都不能多等,那该怎么办呢?那这个时候 A 只好只做这一件事了,在步骤 (2) 的时候只能干等着,以便 (2) 被完成后能在第一时间继续做。