簡體   English   中英

在asyncio中執行`create_task()`的任務是什么時候?

[英]When is the task at `create_task()` executed in asyncio?

在以下代碼中:

import asyncio

async def task_func():
    print('in task_func')
    return 'the result'


async def main(loop):
    print('creating task')
    task = loop.create_task(task_func())
    print('waiting for {!r}'.format(task))
    await asyncio.sleep(2)
    return_value = await task
    print('task completed {!r}'.format(task))
    print('return value: {!r}'.format(return_value))


event_loop = asyncio.new_event_loop()
try:
    event_loop.run_until_complete(main(event_loop))
finally:
    event_loop.close()

當我執行代碼時,結果如下:

creating task
waiting for `<Task pending coro=<task_func() running at <ipython-input-29-797f29858344>:1>>`
in task_func
task completed `<Task finished coro=<task_func() done, defined at <ipython-input-29-797f29858344>:1> result='the result'>`
return value: 'the result'

但我不明白你在loop.create_task(task_func())設置的代碼是什么時候執行的。 具體來說,我假設當你向事件循環添加一個任務時,很快就會執行它,所以我想in task_func中打印之后再waiting for <Task...

然后我發現它總是waiting for <Task...之后執行,所以我添加了await asyncio.sleep(2) ,但只發現在完成2秒之前打印in task_func

我還添加了task_func_2() ,它實際上與task_func()相同,並在task = loop.create_task(task_func())下面創建了它的任務,但是不添加return_value_2 = await task2 ,所以await不執行任務(否則task_func_2()永遠不會被執行)。

所以現在我被困惑了。 何時將任務添加到loop.create_task()的事件循環后執行?

具體來說,我假設當你向事件循環添加一個任務時,很快就會執行它,所以我想in task_func中打印之后再waiting for <Task....

“盡快執行”並不意味着馬上執行。 相反,你可以把它想象成“我們得到的第一次機會”, 我們就是事件循環。 由於print緊跟在create_task的調用之后,此時事件循環還沒有機會運行。 要為事件循環提供運行機會,必須返回事件循環,方法是從當前協程返回,或者等待阻塞的東西。

當你await阻塞協程如asyncio.sleep() ,協同程序將暫時掛起並放棄對事件循環的控制。 事件循環將查看在睡眠過去之前還要做什么,並將在其運行隊列中找到使用create_task計划的任務。 這就是為什么在main協程等待睡眠時執行task_functask_func_2原因 - 而不是在此之前執行,無論你是否特別await它們或其他阻塞的東西。

await諸如task_func的協程意味着在task_func請求其結果,並准備等待它。 (這種等待會自動將執行推遲到事件循環,允許其他協同程序進行。)雖然實現方式不同,但await在概念上類似於join一個線程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM