中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

Python異步之怎么獲取當前和正在運行任務

發布時間:2023-05-11 17:38:20 來源:億速云 閱讀:158 作者:iii 欄目:開發技術

這篇文章主要講解了“Python異步之怎么獲取當前和正在運行任務”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Python異步之怎么獲取當前和正在運行任務”吧!

正文

我們可以反省在 asyncio 事件循環中運行的任務。這可以通過為當前運行的任務和所有正在運行的任務獲取一個 asyncio.Task 對象來實現。

1. 如何獲取當前任務

我們可以通過 asyncio.current_task() 函數獲取當前任務。此函數將為當前正在運行的任務返回一個任務對象。

...
# get the current task
task = asyncio.current_task()
  • 傳遞給 asyncio.run() 的主協程。

  • 通過 asyncio.create_task() 在 asyncio 程序中創建和調度的任務。

一個任務可以創建并運行另一個協程(例如,不包含在任務中)。從協程中獲取當前任務將為正在運行的任務返回一個 Task 對象,但不會返回當前正在運行的協程。

如果協程或任務需要有關自身的詳細信息,例如用于日志記錄的任務名稱,則獲取當前任務會很有幫助。

我們可以探索如何為用于啟動 asyncio 程序的主協程獲取 Task 實例。下面的示例定義了一個用作程序入口點的協程。它報告一條消息,然后獲取當前任務并報告其詳細信息。

這是第一個重要的示例,因為它強調所有協程都可以作為異步事件循環中的任務進行訪問。

下面列出了完整的示例。

# SuperFastPython.com
# example of getting the current task from the main coroutine
import asyncio
# define a main coroutine
async def main():
    # report a message
    print('main coroutine started')
    # get the current task
    task = asyncio.current_task()
    # report its details
    print(task)
# start the asyncio program
asyncio.run(main())

運行該示例首先創建主協程并使用它來啟動 asyncio 程序。main() 協程運行并首先報告一條消息。

然后它檢索當前任務,這是一個代表自身的任務對象,即當前正在運行的協程。然后它會報告當前正在運行的任務的詳細信息。

我們可以看到該任務具有第一個任務的默認名稱“Task-1”,并且正在執行 main() 協程,即當前正在運行的協程。

這突出表明我們可以使用 asyncio.current_task() 函數來訪問當前正在運行的協程的任務對象,該對象自動包裝在任務對象中。

main coroutine started
<Task pending name='Task-1' coro=<main() running at ...> cb=[_run_until_complete_cb() at ...]>

2. 如何獲取所有任務

我們可能需要訪問異步程序中的所有任務。這可能有很多原因,例如:

  • 反省程序的當前狀態或復雜性。

  • 記錄所有正在運行的任務的詳細信息。

  • 查找可以查詢或取消的任務。

我們可以通過 asyncio.all_tasks() 函數在 asyncio 程序中獲取一組所有已計劃和正在運行(尚未完成)的任務。

...
# get all tasks
tasks = asyncio.all_tasks()

這將返回 asyncio 程序中所有任務的集合。它是一個集合,因此每個任務只代表一次。

如果出現以下情況,將包括一項任務:

  • 任務已安排但尚未運行。

  • 該任務當前正在運行(例如,但當前已暫停)

該集合還將包括當前正在運行的任務的任務,例如正在執行調用 asyncio.all_tasks() 函數的協程的任務。

另外,回想一下用于啟動 asyncio 程序的 asyncio.run() 方法會將提供的協程包裝在任務中。這意味著所有任務的集合將包括程序入口點的任務。

我們可以探索在一個 asyncio 程序中有很多任務的情況,然后得到一組所有任務。

在此示例中,我們首先創建 10 個任務,每個任務包裝并運行相同的協程。主協程然后獲取程序中計劃或運行的所有任務的集合并報告它們的詳細信息。

下面列出了完整的示例。

# SuperFastPython.com
# example of starting many tasks and getting access to all tasks
import asyncio
# coroutine for a task
async def task_coroutine(value):
    # report a message
    print(f'task {value} is running')
    # block for a moment
    await asyncio.sleep(1)
# define a main coroutine
async def main():
    # report a message
    print('main coroutine started')
    # start many tasks
    started_tasks = [asyncio.create_task(task_coroutine(i)) for i in range(10)]
    # allow some of the tasks time to start
    await asyncio.sleep(0.1)
    # get all tasks
    tasks = asyncio.all_tasks()
    # report all tasks
    for task in tasks:
        print(f'&gt; {task.get_name()}, {task.get_coro()}')
    # wait for all tasks to complete
    for task in started_tasks:
        await task
# start the asyncio program
asyncio.run(main())

運行該示例首先創建主協程并使用它來啟動 asyncio 程序。main() 協程運行并首先報告一條消息。然后它創建并安排 10 個包裝自定義協程的任務。然后 main() 協程會阻塞片刻以允許任務開始運行。任務開始運行,每個任務報告一條消息,然后休眠。

main() 協程恢復并獲取程序中所有任務的列表。然后它報告每個的名稱和協程。最后,它枚舉已創建的任務列表并等待每個任務完成。

這突出表明我們可以獲得 asyncio 程序中所有任務的集合,其中包括創建的任務以及代表程序入口點的任務。

main coroutine started
task 0 is running
task 1 is running
task 2 is running
task 3 is running
task 4 is running
task 5 is running
task 6 is running
task 7 is running
task 8 is running
task 9 is running
> Task-9, <coroutine object task_coroutine at 0x10e186e30>
> Task-2, <coroutine object task_coroutine at 0x10e184e40>
> Task-11, <coroutine object task_coroutine at 0x10e186f10>
> Task-7, <coroutine object task_coroutine at 0x10e186d50>
> Task-4, <coroutine object task_coroutine at 0x10e185700>
> Task-10, <coroutine object task_coroutine at 0x10e186ea0>
> Task-8, <coroutine object task_coroutine at 0x10e186dc0>
> Task-5, <coroutine object task_coroutine at 0x10e186ab0>
> Task-1, <coroutine object main at 0x10e1847b0>
> Task-3, <coroutine object task_coroutine at 0x10e184f90>
> Task-6, <coroutine object task_coroutine at 0x10e186ce0>

接下來,我們將探討如何同時運行多個協程。

感謝各位的閱讀,以上就是“Python異步之怎么獲取當前和正在運行任務”的內容了,經過本文的學習后,相信大家對Python異步之怎么獲取當前和正在運行任務這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

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

AI

图们市| 勐海县| 平和县| 廊坊市| 柘城县| 舞阳县| 郸城县| 龙州县| 渭源县| 彰化县| 乌鲁木齐市| 涿州市| 庄浪县| 龙州县| 莒南县| 天祝| 平谷区| 石嘴山市| 潮州市| 勃利县| 遂溪县| 武乡县| 兴文县| 突泉县| 荆门市| 习水县| 沧源| 东山县| 天门市| 贵州省| 广河县| 西青区| 永修县| 嘉定区| 东宁县| 德惠市| 泰来县| 苗栗县| 阜康市| 西华县| 临城县|