歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Python 3.5將支持Async/Await異步編程

Python 3.5將支持Async/Await異步編程

日期:2017/3/1 9:29:07   编辑:Linux編程

根據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.

這個關於協程的新提案想明確地把生成器與協程區分開,這麼做有如下好處:

  • 使這兩個概念對新開發者來說更易於理解,因為它們二者的語法並不一樣;
  • 能消除由於重構時不小心移除了協程中的yield聲明而導致的“不明確錯誤”,這會導致協程變成普通的生成器。

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 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved