import asyncio
import time
async def func():
    print('task start')
    await asyncio.sleep(10)
    print('task end')
async def main():
    task1 = asyncio.create_task(func())
    task2 = asyncio.create_task(func())
    task3 = asyncio.create_task(func())
    task4 = asyncio.create_task(func())
    s = time.monotonic()
    print('main start', time.monotonic() - s)
    await task1
    print('main continue', time.monotonic() - s)
    await task2
    print('main continue', time.monotonic() - s)
    await task3
    print('main continue', time.monotonic() - s)
    await task4
    print('main end', time.monotonic() - s)
asyncio.run(main())该代码给出的结果如下:
main start 0.0
task start
task start
task start
task start
task end
task end
task end
task end
main continue 10.0
main continue 10.0
main continue 10.0
main end但是这是怎么可能的,python绕过了我以前的打印调用,先运行awaitables,然后再回打打印电话,我该如何理解呢?
发布于 2020-03-11 12:02:21
你所有的任务都是睡眠10秒,然后继续并几乎立即完成。所以所有的await调用都将在同一时间解锁,因为当任务1完成时,所有的任务也都会完成。
从技术上讲,您可以将task end和main continue之间的打印信息交织在一起,这是正确的,但我想这是一个实现细节,所有的细节看起来都是分组的。
我认为您可以更好地理解使用这个经过调整的脚本所发生的事情:
import asyncio
import time
async def func(task_nb, wait):
    print('[%s] task start' % task_nb)
    await asyncio.sleep(wait)
    print('[%s] task end' % task_nb)
async def main():
    task1 = asyncio.create_task(func(1, 1))
    task2 = asyncio.create_task(func(2, 5))
    task3 = asyncio.create_task(func(3, 7))
    task4 = asyncio.create_task(func(4, 2))
    s = time.monotonic()
    print('main start', time.monotonic() - s)
    await task1
    print('main continue', time.monotonic() - s)
    await task2
    print('main continue', time.monotonic() - s)
    await task3
    print('main continue', time.monotonic() - s)
    await task4
    print('main end', time.monotonic() - s)
asyncio.run(main())您将有一个更有趣的await行为:
main start 1.81000359589234e-07
[1] task start
[2] task start
[3] task start
[4] task start
[1] task end
main continue 1.0019499360005284
[4] task end
[2] task end
main continue 5.001785704000213
[3] task end
main continue 7.003587035000237
main end 7.003632674000073发布于 2020-03-11 12:01:33
您的代码按照asyncio规范执行它应该做的事情,但是您可能误解了“任务”是什么。
从医生那里:
asyncio.create_task(coro, *, name=None)
将coro协同线封装到一个任务中,并安排其执行。返回Task对象。
这意味着,由于您已经在主任务开始时创建了4个任务,它们都计划在同一时间开始执行。所以他们一起打印task start,然后一起打印task end,此时,当所有任务同时完成时(10秒后),所有的await都会立即失效。最后,您将看到main continue 10.0 3次。
试试这段代码,我相信它会有你期待的行为。
async def main():
    task1 = func()
    task2 = func()
    task3 = func()
    task4 = func()
    ...https://stackoverflow.com/questions/60635323
复制相似问题