Python wait如何在for循环中工作?

Python wait如何在for循环中工作?,python,async-await,python-asyncio,Python,Async Await,Python Asyncio,我只是在youtube上看了一个async/await 根据我对await的理解,如果await在任务中,当执行任务时,它会在任务内部遇到await时返回事件循环 因此,如果在for循环(即10个循环)内wait,任务将暂停10次,我应该在事件循环中使用10wait,以完成任务,如下所示: import asyncio async def print_numbers(): for i in range(10): print(i) await asynci

我只是在youtube上看了一个
async/await

根据我对
await
的理解,如果
await
在任务中,当执行任务时,它会在任务内部遇到
await
时返回事件循环

因此,如果在for循环(即10个循环)内
wait
,任务将暂停10次,我应该在事件循环中使用10
wait
,以完成任务,如下所示:

import asyncio

async def print_numbers():
    for i in range(10):
        print(i)
        await asyncio.sleep(0.25)

async def main():
    task2 = asyncio.create_task(print_numbers())
    for i in range(10):
        await task2


asyncio.run(main())
async def print_numbers():
    for i in range(10):
        print(i)
        await asyncio.sleep(0.25)

async def main():
    task2 = asyncio.create_task(print_numbers())
    await task2


asyncio.run(main()
但是,事实上,只需使用1
wait
即可完成任务,如下所示:

import asyncio

async def print_numbers():
    for i in range(10):
        print(i)
        await asyncio.sleep(0.25)

async def main():
    task2 = asyncio.create_task(print_numbers())
    for i in range(10):
        await task2


asyncio.run(main())
async def print_numbers():
    for i in range(10):
        print(i)
        await asyncio.sleep(0.25)

async def main():
    task2 = asyncio.create_task(print_numbers())
    await task2


asyncio.run(main()
我在这个话题中遗漏了什么

当它遇到任务内部的
wait
时,它将返回到事件循环

确实如此,但在启动任务[1]之前,您需要等待任务[0]完成,因此事件循环中没有其他任务可执行。因此,您的代码最终只是睡着了,什么也不做

我应该在事件循环中使用10
wait
,以完成任务

是的,您需要等待启动的10个任务,因此只有在所有10个任务完成后,代码才会继续。但是您应该使用
asyncio.wait
asyncio.gather
,这样单个任务可以并行化,而不必等待前一个任务完成

导入异步IO
随机输入
异步def打印编号(i):
打印(i,“开始”)
等待asyncio.sleep(random.random())
打印(i,‘完成’)
异步def main():
等待异步IO([
异步创建任务(打印编号(i))
对于范围内的i(10)
])
打印('main done')
asyncio.run(main())

如果您忘记了
异步
等待
关键字,那么在这种情况下,非异步函数将如何工作?你可以调用它一次,也可以在循环中调用10次。当你等待一个任务时,你就是在等待,直到该任务被标记为完成。它不能多次完成,所以在循环中等待它并没有任何作用。在您的特定示例中,您也不需要创建任务,您可以简单地
wait print_numbers()
。至于
wait
与事件循环之间的关系,
wait
指示一条可能会将控制权返回到循环的路径,但实际上只有特定的操作才能做到这一点。在您的示例中,唯一会发生的时间是调用
asyncio.sleep
时。如果从
print_numbers
中删除该选项,则在
main
完成之前,事件循环不会接收回控制。
await
确实包含一个隐藏循环,该循环会等待等待被等待者完成所需的尽可能多的暂停。请参阅,以获取
await
的完整卸载。在我的实例中,任务[0]和任务[1]是什么?我的第一个猜测是:任务[0]->
task2
位于
main()
;任务[1]->无,因为我没有在
task
Second guess:task[0]->print_number()中的第一个循环之后创建其他任务;任务[1]->print_number()
main
中的第二个循环正在创建10个任务的列表。我的意思是
task2[0]
task2[1]
task2[9]
(你要创建的10个
print_数字
任务)非常感谢