根據Python增強提案(PEP) 第0492號, Python 3.5將通過async和await語法增加對協程的支持。該提案目的是使協程成為Python語言的原生特性,並“建立一種普遍、易用的異步編程思維模型。”
這個新提議中聲明一個協程的語法如下:
async def read_data(db): pass
async是明確將函數聲明為協程的關鍵字,即便沒有使用await表達式。這樣的函數執行時會返回一個協程對象。
在協程函數內部,可在某個表達式之前使用await關鍵字來暫停協程的執行,以等待某進程完成:
async def read_data(db): data = await db.fetch('SELECT ...') ...
由於增強版生成器的存在,Python中其實早已有了協程的形式,例如當yield或yield from聲明在Python生成器內部出現,該生成器就會被當作協程。
以下示例展示基於生成器的協程的用法:
>>> def createGenerator(): ... mylist = range(3) ... for i in mylist: ... yield i*i ... >>> mygenerator = createGenerator() >>> for i in mygenerator: ... print(i) 0 1 4
以上代碼中,每當生成器在for循環中被調用,該生成器中的for循環就會返回一個新的值。
關於await用法的更多示例請參見上文提到的PEP #0492.
這個關於協程的新提案想明確地把生成器與協程區分開,這麼做有如下好處:
async/await語法能讓程序員以序列方式編寫代碼,但編譯器則會將其當作一系列的協程來處理,從而實現有效的並發。回到我們之前的例子,async/await使我們可以順序地編寫多個await聲明語句,就好像每個語句都會阻塞並等待結果,但實際上這並不會導致任何阻塞:
async def read_data(db): data = await db.fetch('SELECT ...') if (data...) await api.send(data ...')
查看英文原文:Python 3.5 will Support Async/Await Asynchronous Programming
無需操作系統直接運行 Python 代碼 http://www.linuxidc.com/Linux/2015-05/117357.htm
CentOS上源碼安裝Python3.4 http://www.linuxidc.com/Linux/2015-01/111870.htm
《Python核心編程 第二版》.(Wesley J. Chun ).[高清PDF中文版] http://www.linuxidc.com/Linux/2013-06/85425.htm
《Python開發技術詳解》.( 周偉,宗傑).[高清PDF掃描版+隨書視頻+代碼] http://www.linuxidc.com/Linux/2013-11/92693.htm
Python腳本獲取Linux系統信息 http://www.linuxidc.com/Linux/2013-08/88531.htm
在Ubuntu下用Python搭建桌面算法交易研究環境 http://www.linuxidc.com/Linux/2013-11/92534.htm
Python 語言的發展簡史 http://www.linuxidc.com/Linux/2014-09/107206.htm
Python 的詳細介紹:請點這裡
Python 的下載地址:請點這裡