這篇文章主要介紹了python中Task封裝協(xié)程的方法的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇python中Task封裝協(xié)程的方法文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。
創(chuàng)新互聯(lián)建站專(zhuān)注為客戶(hù)提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、黔江網(wǎng)絡(luò)推廣、小程序開(kāi)發(fā)、黔江網(wǎng)絡(luò)營(yíng)銷(xiāo)、黔江企業(yè)策劃、黔江品牌公關(guān)、搜索引擎seo、人物專(zhuān)訪(fǎng)、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)建站為所有大學(xué)生創(chuàng)業(yè)者提供黔江建站搭建服務(wù),24小時(shí)服務(wù)熱線(xiàn):13518219792,官方網(wǎng)址:www.cdcxhl.com
1、Task是Future的子類(lèi),Task是對(duì)協(xié)程的封裝,我們把多個(gè)Task放在循環(huán)調(diào)度列表中,等待調(diào)度執(zhí)行。
2、Task對(duì)象可以跟蹤任務(wù)和狀態(tài)。Future(Task是Futrue的子類(lèi))為我們提供了異步編程中最終結(jié)果的處理(Task類(lèi)還具有狀態(tài)處理功能)。
3、把協(xié)程封裝成Task,加入一個(gè)隊(duì)列等待調(diào)用。剛創(chuàng)建Task的時(shí)候不執(zhí)行,遇到await就執(zhí)行。
import asyncio async def func(): print(1) await asyncio.sleep(2) print(2) return "返回值" async def main(): print("main開(kāi)始") # 創(chuàng)建協(xié)程,將協(xié)程封裝到Task對(duì)象中并添加到事件循環(huán)的任務(wù)列表中,等待事件循環(huán)去執(zhí)行(默認(rèn)是就緒狀態(tài))。 # 在調(diào)用 task_list = [ asyncio.create_task(func(), name="n1"), asyncio.create_task(func(), name="n2") ] print("main結(jié)束") # 當(dāng)執(zhí)行某協(xié)程遇到IO操作時(shí),會(huì)自動(dòng)化切換執(zhí)行其他任務(wù)。 # 此處的await是等待所有協(xié)程執(zhí)行完畢,并將所有協(xié)程的返回值保存到done # 如果設(shè)置了timeout值,則意味著此處最多等待的秒,完成的協(xié)程返回值寫(xiě)入到done中,未完成則寫(xiě)到pending中。 done, pending = await asyncio.wait(task_list, timeout=None) print(done, pending) asyncio.run(main())
知識(shí)點(diǎn)擴(kuò)展:
Task 概念及用法
Task,是 python 中與事件循環(huán)進(jìn)行交互的一種主要方式。
創(chuàng)建 Task,意思就是把協(xié)程封裝成 Task 實(shí)例,并追蹤協(xié)程的 運(yùn)行 / 完成狀態(tài),用于未來(lái)獲取協(xié)程的結(jié)果。
Task 核心作用:在事件循環(huán)中添加多個(gè)并發(fā)任務(wù);
具體來(lái)說(shuō),是通過(guò) asyncio.create_task() 創(chuàng)建 Task,讓協(xié)程對(duì)象加入時(shí)事件循環(huán)中,等待被調(diào)度執(zhí)行。
注意:Python 3.7 以后的版本支持 asyncio.create_task(),在此之前的寫(xiě)法為 loop.create_task(),開(kāi)發(fā)過(guò)程中需要注意代碼寫(xiě)法對(duì)不同版本 python 的兼容性。
需要指出的是,協(xié)程封裝為 Task 后不會(huì)立馬啟動(dòng),當(dāng)某個(gè)代碼 await 這個(gè) Task 的時(shí)候才會(huì)被執(zhí)行。
當(dāng)多個(gè) Task 被加入一個(gè) task_list 的時(shí)候,添加 Task 的過(guò)程中 Task 不會(huì)執(zhí)行,必須要用 await asyncio.wait() 或 await asyncio.gather() 將 Task 對(duì)象加入事件循環(huán)中異步執(zhí)行。
一般在開(kāi)發(fā)中,常用的寫(xiě)法是這樣的:
-- 先創(chuàng)建 task_list 空列表;
-- 然后用 asyncio.create_task() 創(chuàng)建 Task;
-- 再把 Task 對(duì)象加入 task_list;
-- 最后使用 await asyncio.wait 或 await asyncio.gather 將 Task 對(duì)象加入事件循環(huán)中異步執(zhí)行。
注意:創(chuàng)建 Task 對(duì)象時(shí),除了可以使用 asyncio.create_task() 之外,還可以用最低層級(jí)的 loop.create_task() 或 asyncio.ensure_future(),他們都可以用來(lái)創(chuàng)建 Task 對(duì)象,其中關(guān)于 ensure_future 相關(guān)內(nèi)容本文接下來(lái)會(huì)一起講。
Task 用法代碼示例:
import asyncio import arrow def current_time(): """ 獲取當(dāng)前時(shí)間 :return: """ cur_time = arrow.now().to("Asia/Shanghai").format("YYYY-MM-DD HH:mm:ss") return cur_time async def func(sleep_time): func_name_suffix = sleep_time # 使用 sleep_time(函數(shù) I/O 等待時(shí)長(zhǎng))作為函數(shù)名后綴,以區(qū)分任務(wù)對(duì)象 print(f"[{current_time()}] 執(zhí)行異步函數(shù) {func.__name__}-{func_name_suffix}") await asyncio.sleep(sleep_time) print(f"[{current_time()}] 函數(shù) {func.__name__}-{func_name_suffix} 執(zhí)行完畢") return f"【[{current_time()}] 得到函數(shù) {func.__name__}-{func_name_suffix} 執(zhí)行結(jié)果】" async def run(): task_list = [] for i in range(5): task = asyncio.create_task(async_func(i)) task_list.append(task) done, pending = await asyncio.wait(task_list, timeout=None) for done_task in done: print((f"[{current_time()}] 得到執(zhí)行結(jié)果 {done_task.result()}")) def main(): loop = asyncio.get_event_loop() loop.run_until_complete(run()) if __name__ == "__main__": main()
關(guān)于“python中Task封裝協(xié)程的方法”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“python中Task封裝協(xié)程的方法”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。