我们如何调用需要协程的普通函数?
How do we call a normal function where a coroutine is expected?
考虑调用另一个协程的协程:
async def foo(bar):
result = await bar()
return result
如果 bar
是一个协程,这会很好地工作。
我需要做什么(即,我需要用什么来包装对 bar
的调用),以便如果 bar
是一个普通函数,这段代码可以做正确的事情?
完全可以用 async def
定义协程,即使它从不执行任何异步操作(即从不使用 await
)。
但是,问题询问如何在 foo
的代码中 wrap/modify/call 一个常规函数 bar
以便可以等待 bar
。
如果需要,只需用 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)()
考虑调用另一个协程的协程:
async def foo(bar):
result = await bar()
return result
如果 bar
是一个协程,这会很好地工作。
我需要做什么(即,我需要用什么来包装对 bar
的调用),以便如果 bar
是一个普通函数,这段代码可以做正确的事情?
完全可以用 async def
定义协程,即使它从不执行任何异步操作(即从不使用 await
)。
但是,问题询问如何在 foo
的代码中 wrap/modify/call 一个常规函数 bar
以便可以等待 bar
。
如果需要,只需用 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)()