91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python中Task封裝協程的方法

發布時間:2022-03-29 17:07:53 來源:億速云 閱讀:365 作者:iii 欄目:移動開發

這篇文章主要介紹了python中Task封裝協程的方法的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇python中Task封裝協程的方法文章都會有所收獲,下面我們一起來看看吧。

說明

1、Task是Future的子類,Task是對協程的封裝,我們把多個Task放在循環調度列表中,等待調度執行。

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

3、把協程封裝成Task,加入一個隊列等待調用。剛創建Task的時候不執行,遇到await就執行。

實例

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

知識點擴展:

Task 概念及用法

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

創建 Task,意思就是把協程封裝成 Task 實例,并追蹤協程的 運行 / 完成狀態,用于未來獲取協程的結果。

  • Task 核心作用:在事件循環中添加多個并發任務;

具體來說,是通過 asyncio.create_task() 創建 Task,讓協程對象加入時事件循環中,等待被調度執行。

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

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

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

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

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

注意:創建 Task 對象時,除了可以使用 asyncio.create_task() 之外,還可以用最低層級的 loop.create_task() 或 asyncio.ensure_future(),他們都可以用來創建 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(函數 I/O 等待時長)作為函數名后綴,以區分任務對象
    print(f"[{current_time()}] 執行異步函數 {func.__name__}-{func_name_suffix}")
    await asyncio.sleep(sleep_time)
    print(f"[{current_time()}] 函數 {func.__name__}-{func_name_suffix} 執行完畢")
    return f"【[{current_time()}] 得到函數 {func.__name__}-{func_name_suffix} 執行結果】"


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()}] 得到執行結果 {done_task.result()}"))

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


if __name__ == "__main__":
    main()

關于“python中Task封裝協程的方法”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“python中Task封裝協程的方法”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

拉萨市| 福鼎市| 崇左市| 尚义县| 页游| 成武县| 临颍县| 二连浩特市| 淮安市| 彭水| 新郑市| 清涧县| 赞皇县| 牟定县| 无为县| 志丹县| 静乐县| 泰顺县| 大余县| 信宜市| 涟源市| 崇州市| 新兴县| 云浮市| 南丹县| 南昌市| 永嘉县| 达拉特旗| 文安县| 北川| 东源县| 五大连池市| 亳州市| 富蕴县| 营山县| 定襄县| 绵竹市| 房产| 湖南省| 张北县| 鄢陵县|