Python中如何創(chuàng)建和運(yùn)行異步任務(wù)詳解
正文
您可以從 asyncio 程序中的協(xié)程創(chuàng)建任務(wù)對象。任務(wù)提供獨(dú)立調(diào)度和運(yùn)行的協(xié)程的句柄,并允許查詢、取消任務(wù),以及稍后檢索結(jié)果和異常。異步事件循環(huán)管理任務(wù)。因此,所有協(xié)程都成為事件循環(huán)中的任務(wù)并作為任務(wù)進(jìn)行管理。
讓我們仔細(xì)看看 asyncio 任務(wù)。
1. 什么是異步任務(wù)
異步任務(wù)是一個(gè)調(diào)度并獨(dú)立運(yùn)行 asyncio 協(xié)程的對象。它提供了一個(gè)調(diào)度協(xié)程的句柄,asyncio 程序可以查詢并使用它來與協(xié)程交互。
任務(wù)是從協(xié)程創(chuàng)建的。它需要一個(gè)協(xié)程對象,包裝協(xié)程,安排它執(zhí)行,并提供與之交互的方法。任務(wù)獨(dú)立執(zhí)行。這意味著它被安排在 asyncio 事件循環(huán)中,并且無論創(chuàng)建它的協(xié)程中發(fā)生了什么,它都會(huì)執(zhí)行。這與直接執(zhí)行協(xié)程不同,后者調(diào)用者必須等待它完成。
asyncio.Task 類擴(kuò)展了 asyncio.Future 類,一個(gè)實(shí)例是可等待的。Future 是一個(gè)較低級別的類,代表最終會(huì)到達(dá)的結(jié)果。擴(kuò)展 Future 類的類通常被稱為 Future-like。
因?yàn)楫惒饺蝿?wù)是可等待的,這意味著協(xié)程可以使用 await 表達(dá)式等待任務(wù)完成。
... # wait for a task to be done await task
現(xiàn)在我們知道什么是 asyncio 任務(wù),讓我們看看如何創(chuàng)建一個(gè)。
2. 如何創(chuàng)建任務(wù)
使用提供的協(xié)程實(shí)例創(chuàng)建任務(wù)?;叵胍幌聟f(xié)程是使用 async def 表達(dá)式定義的,看起來像一個(gè)函數(shù)。
# define a coroutine async def task_coroutine(): # ...
任務(wù)只能在協(xié)程中創(chuàng)建和調(diào)度。創(chuàng)建和調(diào)度任務(wù)有兩種主要方式,它們是:
- 使用高級 API 創(chuàng)建任務(wù)(首選)
- 使用低級 API 創(chuàng)建任務(wù)
2.1. 高級 API
可以使用 asyncio.create_task() 函數(shù)創(chuàng)建任務(wù)。asyncio.create_task() 函數(shù)接受一個(gè)協(xié)程實(shí)例和一個(gè)可選的任務(wù)名稱,并返回一個(gè) asyncio.Task 實(shí)例。
... # create a coroutine coro = task_coroutine() # create a task from a coroutine task = asyncio.create_task(coro)
這可以通過在一行中使用復(fù)合語句來實(shí)現(xiàn)。
... # create a task from a coroutine task = asyncio.create_task(task_coroutine())
這將做幾件事:
- 將協(xié)程包裝在異步任務(wù)實(shí)例中。
- 安排任務(wù)在當(dāng)前事件循環(huán)中執(zhí)行。
- 返回一個(gè)任務(wù)實(shí)例
任務(wù)實(shí)例可以被丟棄,通過方法與之交互,并由協(xié)程等待。這是從 asyncio 程序中的協(xié)程創(chuàng)建任務(wù)的首選方法。
2.2. 低級 API
也可以使用較低級別的 asyncio API 從協(xié)程創(chuàng)建任務(wù)。
第一種方法是使用 asyncio.ensure_future() 函數(shù)。此函數(shù)采用任務(wù)、未來或類似未來的對象,例如協(xié)程,以及可選的用于調(diào)度它的循環(huán)。如果沒有提供循環(huán),它將被安排在當(dāng)前事件循環(huán)中。
如果為這個(gè)函數(shù)提供了協(xié)程,它會(huì)為我們包裝在一個(gè)實(shí)例中,然后返回。
... # create and schedule the task task = asyncio.ensure_future(task_coroutine())
我們可以用來創(chuàng)建和調(diào)度任務(wù)的另一個(gè)低級函數(shù)是 loop.create_task() 方法。此函數(shù)需要訪問特定的事件循環(huán),在該事件循環(huán)中將協(xié)程作為任務(wù)執(zhí)行。
我們可以通過 asyncio.get_event_loop() 函數(shù)獲取 asyncio 程序中當(dāng)前事件循環(huán)的實(shí)例。然后可以使用它來調(diào)用 create_task() 方法來創(chuàng)建一個(gè) Task 實(shí)例并安排它執(zhí)行。
... # get the current event loop loop = asyncio.get_event_loop() # create and schedule the task task = loop.create_task(task_coroutine())
3. 任務(wù)何時(shí)運(yùn)行?
創(chuàng)建任務(wù)后的一個(gè)常見問題是它什么時(shí)候運(yùn)行?
雖然我們可以通過 create_task() 函數(shù)調(diào)度協(xié)程作為任務(wù)獨(dú)立運(yùn)行,但它可能不會(huì)立即運(yùn)行。事實(shí)上,直到事件循環(huán)有機(jī)會(huì)運(yùn)行,任務(wù)才會(huì)執(zhí)行。
直到所有其他協(xié)程都沒有運(yùn)行并且輪到任務(wù)運(yùn)行時(shí)才會(huì)發(fā)生這種情況。
例如,如果我們有一個(gè) asyncio 程序,其中有一個(gè)創(chuàng)建和調(diào)度任務(wù)的協(xié)程,則調(diào)度的任務(wù)將不會(huì)運(yùn)行,直到創(chuàng)建任務(wù)的調(diào)用協(xié)程被掛起。
如果調(diào)用協(xié)程選擇休眠,選擇等待另一個(gè)協(xié)程或任務(wù),或者選擇等待已安排的新任務(wù),則可能會(huì)發(fā)生這種情況。
... # create a task from a coroutine task = asyncio.create_task(task_coroutine()) # await the task, allowing it to run await task
現(xiàn)在我們知道什么是任務(wù)以及如何安排它們。
以上就是Python中如何創(chuàng)建和運(yùn)行異步任務(wù)詳解的詳細(xì)內(nèi)容,更多關(guān)于Python創(chuàng)建運(yùn)行異步任務(wù)的資料請關(guān)注腳本之家其它相關(guān)文章!
- python基于celery實(shí)現(xiàn)異步任務(wù)周期任務(wù)定時(shí)任務(wù)
- python多進(jìn)程及通信實(shí)現(xiàn)異步任務(wù)的方法
- Python Celery異步任務(wù)隊(duì)列使用方法解析
- python使用celery實(shí)現(xiàn)異步任務(wù)執(zhí)行的例子
- Python使用 Beanstalkd 做異步任務(wù)處理的方法
- Python的Tornado框架的異步任務(wù)與AsyncHTTPClient
- python異步任務(wù)隊(duì)列示例
- Python異步與定時(shí)任務(wù)提高程序并發(fā)性和定時(shí)執(zhí)行效率
相關(guān)文章
Python closure閉包解釋及其注意點(diǎn)詳解
這篇文章主要介紹了Python closure閉包解釋及其注意點(diǎn)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08Python實(shí)現(xiàn)AES加密,解密的兩種方法
這篇文章主要介紹了Python實(shí)現(xiàn)AES加密,解密的兩種方法,幫助大家更好的使用python加解密文件,感興趣的朋友可以了解下2020-10-10給你選擇Python語言實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法的三大理由
這篇文章主要介紹了給你選擇Python語言實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法的三大理由,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11python通過socket搭建極簡web服務(wù)器的實(shí)現(xiàn)代碼
python的web框架眾多,常見的如django、flask、tornado等,其底層是什么還是有些許的疑問,所以查找相關(guān)資料,實(shí)現(xiàn)瀏覽器訪問,并返回相關(guān)信息,本文將給大家介紹python通過socket搭建極簡web服務(wù)器,需要的朋友可以參考下2023-10-10python 集合set中 add與update區(qū)別介紹
這篇文章主要介紹了python 集合set中 add與update區(qū)別介紹,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03Python-Seaborn熱圖繪制的實(shí)現(xiàn)方法
這篇文章主要介紹了Python-Seaborn熱圖繪制的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07Python判斷遠(yuǎn)程服務(wù)器上Excel文件是否被人打開的方法
這篇文章主要介紹了Python如何判斷遠(yuǎn)程服務(wù)器上Excel文件是否被人打開,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07