Python 3.5将支持Async/Await异步编程
根據(jù)Python增強(qiáng)提案(PEP) 第0492號(hào), Python 3.5將通過async和await語法增加對(duì)協(xié)程的支持。該提案目的是使協(xié)程成為Python語言的原生特性,并“建立一種普遍、易用的異步編程思維模型。”
\\這個(gè)新提議中聲明一個(gè)協(xié)程的語法如下:
\\\async def read_data(db):\ pass\\\async是明確將函數(shù)聲明為協(xié)程的關(guān)鍵字,即便沒有使用await表達(dá)式。這樣的函數(shù)執(zhí)行時(shí)會(huì)返回一個(gè)協(xié)程對(duì)象。
\\在協(xié)程函數(shù)內(nèi)部,可在某個(gè)表達(dá)式之前使用await關(guān)鍵字來暫停協(xié)程的執(zhí)行,以等待某進(jìn)程完成:
\\\async def read_data(db):\ data = await db.fetch('SELECT ...')\ ...\\\由于增強(qiáng)版生成器的存在,Python中其實(shí)早已有了協(xié)程的形式,例如當(dāng)yield或yield from聲明在Python生成器內(nèi)部出現(xiàn),該生成器就會(huì)被當(dāng)作協(xié)程。
\\以下示例展示基于生成器的協(xié)程的用法:
\\\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\\以上代碼中,每當(dāng)生成器在for循環(huán)中被調(diào)用,該生成器中的for循環(huán)就會(huì)返回一個(gè)新的值。
\\關(guān)于await用法的更多示例請(qǐng)參見上文提到的PEP #0492.
\\這個(gè)關(guān)于協(xié)程的新提案想明確地把生成器與協(xié)程區(qū)分開,這么做有如下好處:
\\- 使這兩個(gè)概念對(duì)新開發(fā)者來說更易于理解,因?yàn)樗鼈兌叩恼Z法并不一樣; \\
- 能消除由于重構(gòu)時(shí)不小心移除了協(xié)程中的yield聲明而導(dǎo)致的“不明確錯(cuò)誤”,這會(huì)導(dǎo)致協(xié)程變成普通的生成器。 \
async/await語法能讓程序員以序列方式編寫代碼,但編譯器則會(huì)將其當(dāng)作一系列的協(xié)程來處理,從而實(shí)現(xiàn)有效的并發(fā)。回到我們之前的例子,async/await使我們可以順序地編寫多個(gè)await聲明語句,就好像每個(gè)語句都會(huì)阻塞并等待結(jié)果,但實(shí)際上這并不會(huì)導(dǎo)致任何阻塞:
\\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
總結(jié)
以上是生活随笔為你收集整理的Python 3.5将支持Async/Await异步编程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MVC5+EF6 入门完整教程十
- 下一篇: python刷取CSDN博文访问量之一