同步和异步,是两个差距很大的编程模型。同步,就是很多事情一步一步地做,做完上一件,才能做下一件。异步,就是做事情不需要一步一步的,多件事情,可以独立地做。
比如一个有小鸟的笼子,如果打开笼门,一个一个地放飞小鸟,就是同步。如果拆了整个鸟笼,让小鸟随便飞,爱怎么飞就怎么飞,这就是异步。
为什么需要异步编程?
如果我们观察身边的事物,现实中有很多事情是以异步的方式运营的。我们挤地铁的时候,从来都是好几个人一起挤进去的。当我们正在挤地铁时,外面的风照旧吹,雨照旧下,天坛的大爷大妈们正在秀着各种绝活。没有任何事情会因为我们正在挤地铁就停止活动,等我们挤完地铁再恢复运转。
可是,要是说到其中的任何一个人,就不能同时做两件事情了。在挤地铁的时候,就不能在天坛秀绝活。我们写的程序也是这样,先执行第一行,再执行第二行。哪怕第二行再怎么费周折,第三行代码也要等着。
第二行代码可能需要执行大量的计算,需要很多的 CPU;也可能需要大量的传输,占用 I/O 通道。可是,它不一定会把所有的计算机资源都占用了。
如果第二行代码占用了 I/O,我们能不能把多余的 CPU 用起来?如果第二行代码占用了 CPU,我们能不能把空闲的 I/O 用起来? 也就是说,能不能把计算机整体资源更有效地使用起来?