真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

協(xié)程函數(shù)Python,協(xié)程的實(shí)現(xiàn)

Python異步編程4:協(xié)程函數(shù),協(xié)程對(duì)象,await關(guān)鍵字

協(xié)程函數(shù):async def?函數(shù)名。3.5+

創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供雙流網(wǎng)站建設(shè)、雙流做網(wǎng)站、雙流網(wǎng)站設(shè)計(jì)、雙流網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、雙流企業(yè)網(wǎng)站模板建站服務(wù),十載雙流做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

協(xié)程對(duì)象:執(zhí)行協(xié)程函數(shù)()得到的協(xié)程對(duì)象。

3.5之后的寫(xiě)法:

3.7之后的寫(xiě)法:更簡(jiǎn)便

await后面?跟?可等待的對(duì)象。(協(xié)程對(duì)象,F(xiàn)uture,Task對(duì)象?約等于IO等待)

await實(shí)例2:串行執(zhí)行。 一個(gè)協(xié)程函數(shù)里面可以支持多個(gè)await ,雖然會(huì)串行,但是如果有其他協(xié)程函數(shù),任務(wù)列表也在執(zhí)行,依然會(huì)切換。只是案例中的main對(duì)應(yīng)執(zhí)行的others1和others2串行 。 await會(huì)等待對(duì)象的值得到之后才繼續(xù)往下走。

python協(xié)程(4):asyncio

asyncio是官方提供的協(xié)程的類(lèi)庫(kù),從python3.4開(kāi)始支持該模塊

async awiat是python3.5中引入的關(guān)鍵字,使用async關(guān)鍵字可以將一個(gè)函數(shù)定義為協(xié)程函數(shù),使用awiat關(guān)鍵字可以在遇到IO的時(shí)候掛起當(dāng)前協(xié)程(也就是任務(wù)),去執(zhí)行其他協(xié)程。

await + 可等待的對(duì)象(協(xié)程對(duì)象、Future對(duì)象、Task對(duì)象 - IO等待)

注意:在python3.4中是通過(guò)asyncio裝飾器定義協(xié)程,在python3.8中已經(jīng)移除了asyncio裝飾器。

事件循環(huán),可以把他當(dāng)做是一個(gè)while循環(huán),這個(gè)while循環(huán)在周期性的運(yùn)行并執(zhí)行一些協(xié)程(任務(wù)),在特定條件下終止循環(huán)。

loop = asyncio.get_event_loop():生成一個(gè)事件循環(huán)

loop.run_until_complete(任務(wù)):將任務(wù)放到事件循環(huán)

Tasks用于并發(fā)調(diào)度協(xié)程,通過(guò)asyncio.create_task(協(xié)程對(duì)象)的方式創(chuàng)建Task對(duì)象,這樣可以讓協(xié)程加入事件循環(huán)中等待被調(diào)度執(zhí)行。除了使用 asyncio.create_task() 函數(shù)以外,還可以用低層級(jí)的 loop.create_task() 或 ensure_future() 函數(shù)。不建議手動(dòng)實(shí)例化 Task 對(duì)象。

本質(zhì)上是將協(xié)程對(duì)象封裝成task對(duì)象,并將協(xié)程立即加入事件循環(huán),同時(shí)追蹤協(xié)程的狀態(tài)。

注意:asyncio.create_task() 函數(shù)在 Python 3.7 中被加入。在 Python 3.7 之前,可以改用 asyncio.ensure_future() 函數(shù)。

下面結(jié)合async awiat、事件循環(huán)和Task看一個(gè)示例

示例一:

*注意:python 3.7以后增加了asyncio.run(協(xié)程對(duì)象),效果等同于loop = asyncio.get_event_loop(),loop.run_until_complete(協(xié)程對(duì)象) *

示例二:

注意:asyncio.wait 源碼內(nèi)部會(huì)對(duì)列表中的每個(gè)協(xié)程執(zhí)行ensure_future從而封裝為T(mén)ask對(duì)象,所以在和wait配合使用時(shí)task_list的值為[func(),func()] 也是可以的。

示例三:

python 中的協(xié)程是怎么實(shí)現(xiàn)多任務(wù)的?

協(xié)程也稱為微線程,是在一個(gè)線程中,通過(guò)不斷的切換任務(wù)函數(shù)實(shí)現(xiàn)了多任務(wù)的效果。

協(xié)程在python實(shí)現(xiàn)的原理主要是通過(guò)yield這個(gè)關(guān)鍵字實(shí)現(xiàn)

但是真正在開(kāi)發(fā)時(shí),可以不需要自己實(shí)現(xiàn),可以通過(guò)很多成熟的第三方模塊來(lái)實(shí)現(xiàn)協(xié)程,比如greenlet,gevent等模塊。多線程的課程我記得是在黑馬程序員里面找的,一套,還有資料。

Python協(xié)程之a(chǎn)syncio

asyncio 是 Python 中的異步IO庫(kù),用來(lái)編寫(xiě)并發(fā)協(xié)程,適用于IO阻塞且需要大量并發(fā)的場(chǎng)景,例如爬蟲(chóng)、文件讀寫(xiě)。

asyncio 在 Python3.4 被引入,經(jīng)過(guò)幾個(gè)版本的迭代,特性、語(yǔ)法糖均有了不同程度的改進(jìn),這也使得不同版本的 Python 在 asyncio 的用法上各不相同,顯得有些雜亂,以前使用的時(shí)候也是本著能用就行的原則,在寫(xiě)法上走了一些彎路,現(xiàn)在對(duì) Python3.7+ 和 Python3.6 中 asyncio 的用法做一個(gè)梳理,以便以后能更好的使用。

協(xié)程,又稱微線程,它不被操作系統(tǒng)內(nèi)核所管理,而完全是由程序控制,協(xié)程切換花銷(xiāo)小,因而有更高的性能。

協(xié)程可以比作子程序,不同的是,執(zhí)行過(guò)程中協(xié)程可以掛起當(dāng)前狀態(tài),轉(zhuǎn)而執(zhí)行其他協(xié)程,在適當(dāng)?shù)臅r(shí)候返回來(lái)接著執(zhí)行,協(xié)程間的切換不需要涉及任何系統(tǒng)調(diào)用或任何阻塞調(diào)用,完全由協(xié)程調(diào)度器進(jìn)行調(diào)度。

Python 中以 asyncio 為依賴,使用 async/await 語(yǔ)法進(jìn)行協(xié)程的創(chuàng)建和使用,如下 async 語(yǔ)法創(chuàng)建一個(gè)協(xié)程函數(shù):

在協(xié)程中除了普通函數(shù)的功能外最主要的作用就是:使用 await 語(yǔ)法等待另一個(gè)協(xié)程結(jié)束,這將掛起當(dāng)前協(xié)程,直到另一個(gè)協(xié)程產(chǎn)生結(jié)果再繼續(xù)執(zhí)行:

asyncio.sleep() 是 asyncio 包內(nèi)置的協(xié)程函數(shù),這里模擬耗時(shí)的IO操作,上面這個(gè)協(xié)程執(zhí)行到這一句會(huì)掛起當(dāng)前協(xié)程而去執(zhí)行其他協(xié)程,直到sleep結(jié)束,當(dāng)有多個(gè)協(xié)程任務(wù)時(shí),這種切換會(huì)讓它們的IO操作并行處理。

注意,執(zhí)行一個(gè)協(xié)程函數(shù)并不會(huì)真正的運(yùn)行它,而是會(huì)返回一個(gè)協(xié)程對(duì)象,要使協(xié)程真正的運(yùn)行,需要將它們加入到事件循環(huán)中運(yùn)行,官方建議 asyncio 程序應(yīng)當(dāng)有一個(gè)主入口協(xié)程,用來(lái)管理所有其他的協(xié)程任務(wù):

在 Python3.7+ 中,運(yùn)行這個(gè) asyncio 程序只需要一句: asyncio.run(main()) ,而在 Python3.6 中,需要手動(dòng)獲取事件循環(huán)并加入?yún)f(xié)程任務(wù):

事件循環(huán)就是一個(gè)循環(huán)隊(duì)列,對(duì)其中的協(xié)程進(jìn)行調(diào)度執(zhí)行,當(dāng)把一個(gè)協(xié)程加入循環(huán),這個(gè)協(xié)程創(chuàng)建的其他協(xié)程都會(huì)自動(dòng)加入到當(dāng)前事件循環(huán)中。

其實(shí)協(xié)程對(duì)象也不是直接運(yùn)行,而是被封裝成一個(gè)個(gè)待執(zhí)行的 Task ,大多數(shù)情況下 asyncio 會(huì)幫我們進(jìn)行封裝,我們也可以提前自行封裝 Task 來(lái)獲得對(duì)協(xié)程更多的控制權(quán),注意,封裝 Task 需要 當(dāng)前線程有正在運(yùn)行的事件循環(huán) ,否則將引 RuntimeError,這也就是官方建議使用主入口協(xié)程的原因,如果在主入口協(xié)程之外創(chuàng)建任務(wù)就需要先手動(dòng)獲取事件循環(huán)然后使用底層方法 loop.create_task() ,而在主入口協(xié)程之內(nèi)是一定有正在運(yùn)行的循環(huán)的。任務(wù)創(chuàng)建后便有了狀態(tài),可以查看運(yùn)行情況,查看結(jié)果,取消任務(wù)等:

asyncio.create_task() 是 Python3.7 加入的高層級(jí)API,在 Python3.6,需要使用低層級(jí)API asyncio.ensure_future() 來(lái)創(chuàng)建 Future,F(xiàn)uture 也是一個(gè)管理協(xié)程運(yùn)行狀態(tài)的對(duì)象,與 Task 沒(méi)有本質(zhì)上的區(qū)別。

通常,一個(gè)含有一系列并發(fā)協(xié)程的程序?qū)懛ㄈ缦拢≒ython3.7+):

并發(fā)運(yùn)行多個(gè)協(xié)程任務(wù)的關(guān)鍵就是 asyncio.gather(*tasks) ,它接受多個(gè)協(xié)程任務(wù)并將它們加入到事件循環(huán),所有任務(wù)都運(yùn)行完成后會(huì)返回結(jié)果列表,這里我們也沒(méi)有手動(dòng)封裝 Task,因?yàn)?gather 函數(shù)會(huì)自動(dòng)封裝。

并發(fā)運(yùn)行還有另一個(gè)方法 asyncio.wait(tasks) ,它們的區(qū)別是:

如何用python寫(xiě)一個(gè)協(xié)程

我學(xué)習(xí)了asyncio的協(xié)程,現(xiàn)在在我的印象中一個(gè)協(xié)程有兩個(gè)要素:

* 用`asyncio.coroutine`裝飾

* 用`yield from`調(diào)用其他協(xié)程

我想要了解協(xié)程是什么,所以做了以下嘗試。

我經(jīng)過(guò)嘗試,發(fā)現(xiàn)運(yùn)行構(gòu)造出來(lái)的協(xié)程得到的是一個(gè)`generator`(迭代器)。

而最常規(guī)的迭代器生成使用的是`yield`。

所以同樣是生成迭代器,那協(xié)程是否可以用`yield`而不是`yield from`。

我經(jīng)過(guò)嘗試,發(fā)現(xiàn)協(xié)程的調(diào)用有特殊的方式。

而最常規(guī)的迭代器都是直接調(diào)用就可以的。

所以,同樣是函數(shù),那協(xié)程是否可以脫離`event_loop`(消息循環(huán))調(diào)用。

我還嘗試過(guò)通過(guò)`yield`構(gòu)造一個(gè)協(xié)程。

沒(méi)有報(bào)錯(cuò)也運(yùn)行成功了,所以應(yīng)該沒(méi)有問(wèn)題。


新聞標(biāo)題:協(xié)程函數(shù)Python,協(xié)程的實(shí)現(xiàn)
標(biāo)題鏈接:http://weahome.cn/article/dsejegg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部