我们如何调用正常的函数来预期协程?

时间:2016-07-24 23:12:45

标签: python concurrency python-asyncio

考虑一个调用另一个协程的协程:

async def foo(bar):
     result = await bar()
     return result

如果bar是协程,这可以正常工作。 我需要做什么(即我需要将调用包装到bar),以便在bar是正常函数时,此代码能做正确的事情?

完全可以定义一个带有async def的协程,即使它从不执行任何异步操作(即从不使用await)。 但是,问题是如何在bar的代码中包装/修改/调用常规函数foo,以便等待bar

1 个答案:

答案 0 :(得分:8)

如果需要,只需用asyncio.coroutine包装同步函数:

if not asyncio.iscoroutinefunction(bar):
    bar = asyncio.coroutine(bar)

由于重新包装协程是安全的,因此实际上不需要协程功能测试:

async_bar = asyncio.coroutine(sync_or_async_bar)

因此,您的代码可以重写如下:

async def foo(bar):
     return await asyncio.coroutine(bar)()