在本期的开源周报中介绍了 GINO —— 一个为 SQL asyncio 构建的轻量级异步 ORM,而这一次要介绍的就是何为异步。

异步

为完成某个任务,不同程序单元之间过程中无需协调通讯,也能完成任务的方式,就可以称为异步。对于异步,首先,不相关的程序单元之间是可以异步的。例如,爬虫下载网页。调度程序调用下载程序后,即可调度其他任务,而无需与该下载任务保持通信以协调行为。不同网页的下载、保存等操作都是无关的,也无需相互通知协调。这些异步操作的完成时刻并不确定。

简而言之,异步意味着无序。

而异步编程是指以进程、线程、协程、函数/方法作为执行任务程序的基本单位,结合回调、事件循环、信号量等机制,以提高程序整体执行效率和并发能力的编程方式。

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

同步与异步

同步和异步相对。同步指的是不同的程序单元为了完成某个任务而依靠一些通信方式协调一致的方式,而异步指的是不同程序单元无需依靠通信协调也能完成任务的方式。

同步的优缺点

同步流程最大的好处就是有序,可以更简单的处理结果,也能很容易的发现错误并改正。同步流程也符合我们的自然思想,使编程变得简单,程序也更容易掌控。

同步的缺点就在于交互方面,如果通信效率下降或者是执行任务所需要的时间过长,程序就需要花费更多的时间暂停自己去等待任务的完成,而在程序等待着任务完成的这段时间里,它是无法执行其他行动的,这就相当于无谓的浪费时间和资源。

异步的优缺点

异步意味着无序,一个任务开始之后就可以进行其他操作,而它什么时候完成是未定的,而这带来的最大好处就是在等待结果的这段时间里可以进行其他操作,提高了程序的效率。

而异步也是有缺点的,那就是难以控制程序,这个程序什么时候发生了什么事件是不可预料的。而同步代码改为异步代码也会需要重新布置代码结构,精心安排异步的任务,还需要利用回调函数,对于新手来说着实有些困难。

异步编程的前途

异步编程的发展前景,可以说是一片大好,具体原因嘛,看看这些大公司的动作就知道了。

.NET 与C# 的每个版本发布都是有一个“主题”。即:C#1.0托管代码→C#2.0泛型→C#3.0LINQ→C#4.0动态语言→C#5.0异步编程。C#5.0的主题是异步编程,这说明了啥?说明了异步编程是大势所趋。

在2010年的 PDC 上,微软发布了 Visual Studio Async CTP,大大地降低了异步编程的难度,让我们可以像写同步的方法那样去编写异步代码。微软为什么花精力让异步编程变得简单?因为市场需求嘛,这样能到让开发者更轻松。而很多开发者都看好的技术,我觉得是靠谱的。

从上两届 PyCon 技术大会看来,异步编程已经成了 Python 生态下一阶段的主旋律。如新兴的 Go、Rust、Elixir 等编程语言都将其支持异步和高并发作为主要“卖点”,技术变化趋势如此。Python 生态为不落人后,从2013年起由 Python 之父 Guido 亲自操刀主持了 Tulip(asyncio) 项目的开发。很显然,大家都意识到了异步编程将会掀起一场技术的风暴,都纷纷加入异步编程的大军中来。你还能说异步编程前景不好吗?