[英]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_func
和task_func_2
原因 - 而不是在此之前執行,無論你是否特別await
它們或其他阻塞的東西。
await
諸如task_func
的協程意味着在task_func
請求其結果,並准備等待它。 (這種等待會自動將執行推遲到事件循環,允許其他協同程序進行。)雖然實現方式不同,但await
在概念上類似於join
一個線程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.