1. 程式人生 > >這篇文章講得精彩-深入理解 Python 非同步程式設計(上)!

這篇文章講得精彩-深入理解 Python 非同步程式設計(上)!

可惜,二和三現在還沒有出來~

~~~~~~~~~~~~~~~~~~~~~~~~~

http://python.jobbole.com/88291/

~~~~~~~~~~~~~~~~~~~~~~~~~~~

在Python 3.3 引入yield from新語法之後,就不再推薦用yield去做協程。全都使用yield from由於其雙向通道的功能,可以讓我們在協程間隨心所欲地傳遞資料。

4.5.3 yield from改進協程總結

yield from改進基於生成器的協程,程式碼抽象程度更高。使業務邏輯相關的程式碼更精簡。由於其雙向通道功能可以讓協程之間隨心所欲傳遞資料,使Python非同步程式設計的協程解決方案大大向前邁進了一步。

於是Python語言開發者們充分利用yield from,使 Guido 主導的Python非同步程式設計框架Tulip迅速脫胎換骨,並迫不及待得讓它在 Python 3.4 中換了個名字asyncio以“實習生”角色出現在標準庫中。

4.5.4 asyncio 介紹

asyncio是Python 3.4 試驗性引入的非同步I/O框架(PEP 3156),提供了基於協程做非同步I/O編寫單執行緒併發程式碼的基礎設施。其核心元件有事件迴圈(Event Loop)、協程(Coroutine)、任務(Task)、未來物件(Future)以及其他一些擴充和輔助性質的模組。

在引入asyncio的時候,還提供了一個裝飾器@asyncio.coroutine

用於裝飾使用了yield from的函式,以標記其為協程。但並不強制使用這個裝飾器。

雖然發展到 Python 3.4 時有了yield from的加持讓協程更容易了,但是由於協程在Python中發展的歷史包袱所致,很多人仍然弄不明白生成器協程的聯絡與區別,也弄不明白yield和 yield from 的區別。這種混亂的狀態也違背Python之禪的一些準則。

於是Python設計者們又快馬加鞭地在 3.5 中新增了async/await語法(PEP 492),對協程有了明確而顯式的支援,稱之為原生協程async/await 和 yield from這兩種風格的協程底層複用共同的實現,而且相互相容。

在Python 3.6 中asyncio庫“轉正”,不再是實驗性質的,成為標準庫的正式一員。

4.6 總結

行至此處,我們已經掌握了asyncio的核心原理,學習了它的原型,也學習了非同步I/O在 CPython 官方支援的生態下是如何一步步發展至今的。

實際上,真正的asyncio比我們前幾節中學到的要複雜得多,它還實現了零拷貝、公平排程、異常處理、任務狀態管理等等使 Python 非同步程式設計更完善的內容。理解原理和原型對我們後續學習有莫大的幫助。