gpt4 book ai didi

python - `create_task()`处的任务是什么时候asyncio执行的?

转载 作者:太空狗 更新时间:2023-10-30 02:37:26 26 4
gpt4 key购买 nike

在下面的代码中:

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_funcwaiting for <Task... 之前打印.

然后我发现它总是waiting for <Task...之后执行,所以我添加了 await asyncio.sleep(2) , 但只发现 in task_func在 2 秒结束前打印。

我还添加了 task_func_2()这实际上与 task_func() 相同并在 task = loop.create_task(task_func()) 下面创建任务但不要添加 return_value_2 = await task2 , 所以 await不执行任务(否则 task_func_2() 永远不会执行)。

所以现在我很困惑。 loop.create_task()中的任务加入事件循环后什么时候执行?

最佳答案

Specifically, I assumed when you add a task to the event loop, it is executed soon, so I thought in task_func is printed before waiting for <Task....

“很快执行”并不意味着立即执行。相反,您可以将其视为“我们一有机会就执行”,我们就是事件循环。自 print紧随调用 create_task ,此时事件循环还没有机会运行。要让事件循环有机会运行,您必须返回到事件循环,方法是从当前协程返回,或者等待阻塞的东西。

当你await阻塞协程,例如 asyncio.sleep() ,协程将暂时挂起并放弃对事件循环的控制。事件循环将查看在 sleep 结束之前还有什么要做的,并将找到使用 create_task 安排的任务。在它的运行队列中。这就是为什么 task_functask_func_2main 时执行协程等待 sleep ——但不会在那之前,不管你是否await特别是它们或其他东西会阻塞。

await调用协程,例如 task_func意味着当场请求它的结果,并准备好在协程挂起时等待它。 (等待自动挂起的东西将执行推迟到事件循环,允许其他协程取得进展。)虽然实现不同,但 await在概念上类似于 join正在处理一个线程。

关于python - `create_task()`处的任务是什么时候asyncio执行的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50156371/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com