首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >await是否保证执行顺序?

await是否保证执行顺序?
EN

Stack Overflow用户
提问于 2017-08-01 08:22:49
回答 1查看 1.6K关注 0票数 3

考虑一个单线程的Python程序。名为"first“的协程在I/O上被阻塞。随后的指令是"await second”。是否保证协程“秒”立即执行,直到它阻塞I/O?或者,在调用"second“之前,"first”是否可以恢复执行(由于I/O操作完成)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-01 15:12:11

Asyncio实现了一种方式,second将开始执行,直到它将控制权返回给事件循环(这通常发生在它到达某个I/O操作时),并且只有在它之后first才能恢复。我不认为它能以某种方式向你保证,但也很难相信这个实现会被改变。

如果出于某种原因,您不希望first在到达second的某个部分之前继续执行,那么显式地使用Lock在您想要的时刻之前阻止first执行可能会更好。

显示何时控制返回到事件循环和执行流程可以更改的示例:

代码语言:javascript
复制
import asyncio


async def async_print(text):
    print(text)


async def first():
    await async_print('first 1')
    await async_print('first 2')
    await asyncio.sleep(0)  # returning control to event loop
    await async_print('first 3')


async def second():
    await async_print('second 1')
    await async_print('second 2')
    await asyncio.sleep(0)  # returning control to event loop
    await async_print('second 3')


async def main():
    asyncio.ensure_future(first())
    asyncio.ensure_future(second())
    await asyncio.sleep(1)


loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
try:
    loop.run_until_complete(main())
finally:
    loop.run_until_complete(loop.shutdown_asyncgens())
    loop.close() 

输出:

代码语言:javascript
复制
first 1
first 2
second 1
second 2
first 3
second 3
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45427152

复制
相关文章

相似问题

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