Python 上篇:1- 爲什麼需要異步編程?

Python 上篇

  1. 爲什麼需要異步編程?它和同步編程有哪些區別

1. 首先介紹同步和異步

1.1 同步

不同程序單元爲了完成某個任務,在執行過程中需靠某種通信方式來協調程序單元保持順序一致,稱這些程序單元是同步執行的。

例如電商系統中更新商品庫存,需要用 “行鎖” 作爲通信信號,讓不同的更新請求排隊順序執行,這樣就保證了更新庫存的操作是同步的。

同步更加強調:有序

1.2 異步

爲了完成某個任務,不同程序單元之間執行過程中無需通過通信協調,也能完成任務的方式。

例如,爬蟲下載網頁。調度程序調用下載程序後,即可調度其他任務,而無需與該下載任務保持通信以協調行爲。不同網頁的下載、保存等操作都是無關的,也無需相互通知協調。這些異步操作的完成時刻並不確定。

異步更加強調:無序

2. 其次介紹阻塞和非阻塞

2.1 阻塞

程序在等待某個操作完成期間,自身無法繼續幹別的事情,則稱該程序在該操作上是阻塞的。

常見的阻塞形式有:網絡 I/O 阻塞、磁盤 I/O 阻塞、用戶輸入阻塞等。

阻塞是無處不在的,包括 CPU 切換上下文時,所有的進程都會被阻塞。(如果是多核 CPU 則正在執行上下文切換操作的核不可被利用)

2.2 非阻塞

程序在等待某操作的過程中,自身不被阻塞,可以繼續運行幹別的事情,則稱該程序在該操作上是非阻塞的。

非阻塞的存在是因爲阻塞存在,正因爲某個操作阻塞導致的耗時與效率低下,我們纔要把它變成非阻塞的。

3. 最後介紹併發和並行

3.1 併發

以利用有限的計算機資源使多個任務可以被實時或近實時的執行或計算。

併發更加強調程序的組織結構,比如在 golang 中,你 go 出去一個 goroutine,對於程序來說就是一個併發。go 出去多個 goroutine 就是多個併發。

3.2 並行

以利用多核 CPU 的優勢加速完成多個任務或計算。

併發提供了一種程序組織結構方式,讓問題的解決方案可以並行執行,但並行執行不是必須的。


那異步編程到底是什麼,它和同步編程有哪些區別

以進程、線程、協程、函數 / 方法作爲執行任務程序的基本單位,結合回調、事件循環、信號量等機制,以提高程序整體執行效率和併發能力的編程方式。如果在某程序的運行時,能根據已經執行的指令準確判斷它接下來要進行哪個具體操作,那它是同步程序,反之則爲異步程序。(無序與有序的區別)

同步 / 異步、阻塞 / 非阻塞並非水火不容,要看討論的程序所處的封裝級別。例如購物程序在處理多個用戶的瀏覽請求可以是異步的,而更新庫存時必須是同步的。


4. 小結

這篇文章大致講解了一些基礎概念,這些概念大家可能都比較熟悉,所以下篇文章我們重點講解:異步編程的核心:epoll+Callback+Event loop。

5. 關注公衆號

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/f9nHLEWOGiCNFsZMcn7JNQ