在本期的開源周報中介紹了 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) 項目的開發。很顯然,大家都意識到了非同步編程將會掀起一場技術的風暴,都紛紛加入非同步編程的大軍中來。你還能說非同步編程前景不好嗎?