Python 3.5将支持Async/Await异步编程
根據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生成器內部出現,該生成器就會被當作協程。
\\以下示例展示基于生成器的協程的用法:
\\\u0026gt;\u0026gt;\u0026gt; def createGenerator():\... mylist = range(3)\... for i in mylist:\... yield i*i\...\\u0026gt;\u0026gt;\u0026gt; mygenerator = createGenerator()\\u0026gt;\u0026gt;\u0026gt; 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 3.5将支持Async/Await异步编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MVC5+EF6 入门完整教程十
- 下一篇: MAC 下SVN 删除文件失败 提示em