天天看點

Python協程:從yield/send到async/await

這個文章理好了脈落。

http://python.jobbole.com/86069/

我練 習了一番,感受好了很多。。。

Python由于衆所周知的GIL的原因,導緻其線程無法發揮多核的并行計算能力(當然,後來有了multiprocessing,可以實作多程序并行),顯得比較雞肋。既然在GIL之下,同一時刻隻能有一個線程在運作,那麼對于CPU密集的程式來說,線程之間的切換開銷就成了拖累,而以I/O為瓶頸的程式正是協程所擅長的:

多任務并發(非并行),每個任務在合适的時候挂起(發起I/O)和恢複(I/O結束)

弄清楚了asyncio.coroutine和yield from之後,在Python3.5中引入的async和await就不難了解了:可以将他們了解成asyncio.coroutine/yield from的完美替身。當然,從Python設計的角度來說,async/await讓協程表面上獨立于生成器而存在,将細節都隐藏于asyncio子產品之下,文法更清晰明了。

Python協程:從yield/send到async/await

Python中的協程經曆了很長的一段發展曆程。其大概經曆了如下三個階段:

最初的生成器變形yield/send 引入@asyncio.coroutine和yield from 在最近的Python3.5版本中引入async/await關鍵字