濮阳杆衣贸易有限公司

主頁 > 知識庫 > python中Task封裝協(xié)程的知識點總結

python中Task封裝協(xié)程的知識點總結

熱門標簽:南昌地圖標注 百應電話機器人總部 旅游廁所地圖標注怎么弄 西青語音電銷機器人哪家好 成都呼叫中心外呼系統(tǒng)哪家強 無錫智能外呼系統(tǒng)好用嗎 宿州電話機器人哪家好 電梯新時達系統(tǒng)外呼顯示e 地圖標注與注銷

說明

1、Task是Future的子類,Task是對協(xié)程的封裝,我們把多個Task放在循環(huán)調度列表中,等待調度執(zhí)行。

2、Task對象可以跟蹤任務和狀態(tài)。Future(Task是Futrue的子類)為我們提供了異步編程中最終結果的處理(Task類還具有狀態(tài)處理功能)。

3、把協(xié)程封裝成Task,加入一個隊列等待調用。剛創(chuàng)建Task的時候不執(zhí)行,遇到await就執(zhí)行。

實例

import asyncio
 
async def func():
print(1)
await asyncio.sleep(2)
print(2)
return "返回值"
 
 
async def main():
print("main開始")
 
# 創(chuàng)建協(xié)程,將協(xié)程封裝到Task對象中并添加到事件循環(huán)的任務列表中,等待事件循環(huán)去執(zhí)行(默認是就緒狀態(tài))。
# 在調用
task_list = [
asyncio.create_task(func(), name="n1"),
asyncio.create_task(func(), name="n2")
]
 
print("main結束")
 
# 當執(zhí)行某協(xié)程遇到IO操作時,會自動化切換執(zhí)行其他任務。
# 此處的await是等待所有協(xié)程執(zhí)行完畢,并將所有協(xié)程的返回值保存到done
# 如果設置了timeout值,則意味著此處最多等待的秒,完成的協(xié)程返回值寫入到done中,未完成則寫到pending中。
done, pending = await asyncio.wait(task_list, timeout=None)
print(done, pending)
 
 
asyncio.run(main())

知識點擴展:

Task 概念及用法

  • Task,是 python 中與事件循環(huán)進行交互的一種主要方式。

創(chuàng)建 Task,意思就是把協(xié)程封裝成 Task 實例,并追蹤協(xié)程的 運行 / 完成狀態(tài),用于未來獲取協(xié)程的結果。

  • Task 核心作用:在事件循環(huán)中添加多個并發(fā)任務;

具體來說,是通過 asyncio.create_task() 創(chuàng)建 Task,讓協(xié)程對象加入時事件循環(huán)中,等待被調度執(zhí)行。

注意:Python 3.7 以后的版本支持 asyncio.create_task(),在此之前的寫法為 loop.create_task(),開發(fā)過程中需要注意代碼寫法對不同版本 python 的兼容性。

  • 需要指出的是,協(xié)程封裝為 Task 后不會立馬啟動,當某個代碼 await 這個 Task 的時候才會被執(zhí)行。

當多個 Task 被加入一個 task_list 的時候,添加 Task 的過程中 Task 不會執(zhí)行,必須要用 await asyncio.wait() 或 await asyncio.gather() 將 Task 對象加入事件循環(huán)中異步執(zhí)行。

  • 一般在開發(fā)中,常用的寫法是這樣的:

-- 先創(chuàng)建 task_list 空列表;
-- 然后用 asyncio.create_task() 創(chuàng)建 Task;
-- 再把 Task 對象加入 task_list;
-- 最后使用 await asyncio.wait 或 await asyncio.gather 將 Task 對象加入事件循環(huán)中異步執(zhí)行。

注意:創(chuàng)建 Task 對象時,除了可以使用 asyncio.create_task() 之外,還可以用最低層級的 loop.create_task() 或 asyncio.ensure_future(),他們都可以用來創(chuàng)建 Task 對象,其中關于 ensure_future 相關內容本文接下來會一起講。

Task 用法代碼示例:

import asyncio
import arrow


def current_time():
    '''
    獲取當前時間
    :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ù)名后綴,以區(qū)分任務對象
    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í)行結果】"


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í)行結果 {done_task.result()}"))

def main():
    loop = asyncio.get_event_loop()
    loop.run_until_complete(run())


if __name__ == '__main__':
    main()

到此這篇關于python中Task封裝協(xié)程的知識點總結的文章就介紹到這了,更多相關python中Task封裝協(xié)程內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Python自動化測試PO模型封裝過程詳解
  • Python面向對象封裝繼承和多態(tài)示例講解
  • Python 調用C++封裝的進一步探索交流
  • Python如何實現(xiàn)Paramiko的二次封裝
  • 使用Python封裝excel操作指南
  • python excel和yaml文件的讀取封裝
  • python 使用paramiko模塊進行封裝,遠程操作linux主機的示例代碼
  • Python之根據(jù)輸入?yún)?shù)計算結果案例講解

標簽:許昌 西安 渭南 辛集 七臺河 濰坊 雅安 贛州

巨人網(wǎng)絡通訊聲明:本文標題《python中Task封裝協(xié)程的知識點總結》,本文關鍵詞  python,中,Task,封裝,協(xié)程,;如發(fā)現(xiàn)本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《python中Task封裝協(xié)程的知識點總結》相關的同類信息!
  • 本頁收集關于python中Task封裝協(xié)程的知識點總結的相關信息資訊供網(wǎng)民參考!
  • 推薦文章
    新丰县| 荔浦县| 曲靖市| 萨嘎县| 凉城县| 静乐县| 岳阳县| 石楼县| 永川市| 临漳县| 三河市| 南和县| 吴旗县| 淮北市| 黄平县| 方山县| 沈丘县| 绿春县| 蓬安县| 苏尼特左旗| 永济市| 抚松县| 明星| 盐池县| 南城县| 隆昌县| 桐柏县| 金湖县| 宁强县| 泾源县| 凤翔县| 内黄县| 高密市| 宁乡县| 钟祥市| 江达县| 牡丹江市| 全南县| 旬邑县| 四子王旗| 莒南县|