【问题标题】:Does await guarantee execution order?await 保证执行顺序吗?
【发布时间】:2018-01-07 16:34:43
【问题描述】:

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

【问题讨论】:

    标签: python-asyncio


    【解决方案1】:

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

    如果出于某种原因您不希望 first 在到达 second 的某些部分之前继续执行,那么最好明确地使用 Lock 来阻止 first 在您想要的时刻之前执行。

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

    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() 
    

    输出:

    first 1
    first 2
    second 1
    second 2
    first 3
    second 3
    

    【讨论】:

    • 谢谢。我主要关心“等待”和等待的事情执行之间可能经过的时间量。如果由于某些我不一定知道的 I/O 而需要几秒钟的时间,那么 asyncio 将毫无用处。我很高兴。
    猜你喜欢
    • 1970-01-01
    • 2016-04-29
    • 1970-01-01
    • 2014-09-09
    • 2021-03-07
    • 1970-01-01
    • 2022-08-14
    • 2014-07-22
    • 2018-12-15
    相关资源
    最近更新 更多