首页 > 解决方案 > 使用 asyncio python 超时时取消进程

问题描述

我尝试在超时但 asyncio.wait_for 不起作用时取消进程。超时时如何取消进程。我的代码如下:

import asyncio
async def process():
    # do something take a long time like this
    for i in range(0,10000000000,1):
        for j in range(0,10000000000,1):
            continue
    print('done!')

async def main():
    # I want to cancel process when reached timeout
    try:
        await asyncio.wait_for(process(), timeout=1.0)
    except asyncio.TimeoutError:
        print('timeout!')
loop = asyncio.get_event_loop()
loop.run_until_complete(main())

标签: pythonpython-3.xasync-awaitpython-asyncio

解决方案


这不起作用,因为您的process函数只是名称上的异步 - 它不会等待任何东西。这意味着它完全完成了,而没有给事件循环一个中断它的机会。由于 asyncio 是协作的(与其他基于 async/await 的系统一样),因此这样的函数不是正确编写的 async 函数并且不能被中断。

如果您将一个添加await asyncio.sleep(0.001)到内部循环(或任何其他等待实际挂起的东西),您的代码将正常工作。


推荐阅读