asyncio:等待超时的异步回调

asyncio: wait for async callback with timeout

我不太习惯asyncio,所以这个问题可能是微不足道的。

我有一个异步代码 运行ning,它会在完成后 运行 回调(回调可以是可调用的或可等待的)。我想等待回调被调用,超时。我感觉它在概念上是一个任务,但我不确定如何创建任务,但在其他地方等待它。

import asyncio, inspect

async def expensivefunction(callback):
    # this is something which takes a lot of time
    await asyncio.sleep(10)
    # but eventually computes the result
    result=10
    # and calls the callback
    callback(result)
    if inspect.isawaitable(callback): await callback

# just print the result, for example
async def callback(result): print(result)

# main code async
async def myfunc():
    await expensivefunction(callback=callback)
    # this will wait for callback to be called within 5 seconds
    # if not, exception is thrown
    await asyncio.wait_for(...??,timeout=5)

asyncio.run(myfunc())

正确的做法是什么?

请查找工作示例:

import asyncio

AWAIT_TIME = 5.0


async def expensive_function():
    """this is something which takes a lot of time"""
    await asyncio.sleep(10)
    result = 10

    return result


def callback(fut: asyncio.Future):
    """just prints result. Callback should be sync function"""
    if not fut.cancelled() and fut.done():
        print(fut.result())
    else:
        print("No results")


async def amain():
    """Main async func in the app"""
    # create task
    task = asyncio.create_task(expensive_function())
    task.add_done_callback(callback)
    # try to await the task
    try:
        r = await asyncio.wait_for(task, timeout=AWAIT_TIME)
    except asyncio.TimeoutError as ex:
        print(ex)
    else:
        print(f"All work done fine: {r}")
    finally:
        print("App finished!")


if __name__ == '__main__':
    asyncio.run(amain())

如有任何问题,请告诉我。