首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >python如何绕过我以前的代码,先运行以后的代码?

python如何绕过我以前的代码,先运行以后的代码?
EN

Stack Overflow用户
提问于 2020-03-11 11:47:49
回答 2查看 65关注 0票数 2
代码语言:javascript
运行
复制
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())

该代码给出的结果如下:

代码语言:javascript
运行
复制
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,然后再回打打印电话,我该如何理解呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-11 12:02:21

你所有的任务都是睡眠10秒,然后继续并几乎立即完成。所以所有的await调用都将在同一时间解锁,因为当任务1完成时,所有的任务也都会完成。

从技术上讲,您可以将task endmain continue之间的打印信息交织在一起,这是正确的,但我想这是一个实现细节,所有的细节看起来都是分组的。

我认为您可以更好地理解使用这个经过调整的脚本所发生的事情:

代码语言:javascript
运行
复制
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行为:

代码语言:javascript
运行
复制
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
票数 2
EN

Stack Overflow用户

发布于 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次。

试试这段代码,我相信它会有你期待的行为。

代码语言:javascript
运行
复制
async def main():
    task1 = func()
    task2 = func()
    task3 = func()
    task4 = func()
    ...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60635323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档