Python 我们如何调用一个正常的函数,其中需要一个协程?
考虑调用另一个协同路由的协同路由:Python 我们如何调用一个正常的函数,其中需要一个协程?,python,concurrency,python-asyncio,Python,Concurrency,Python Asyncio,考虑调用另一个协同路由的协同路由: async def foo(bar): result = await bar() return result 如果bar是一个协同程序,那么这种方法可以很好地工作。 如果bar是一个正常函数,我需要做什么(即,我需要用什么来包装对bar的调用),以便该代码做正确的事情 使用async def定义协同程序是完全可能的,即使它从不做任何异步的事情(即从不使用wait)。 但是,问题是如何在foo的代码中包装/修改/调用常规函数bar,以便等待
async def foo(bar):
result = await bar()
return result
如果bar
是一个协同程序,那么这种方法可以很好地工作。
如果bar
是一个正常函数,我需要做什么(即,我需要用什么来包装对bar
的调用),以便该代码做正确的事情
使用async def
定义协同程序是完全可能的,即使它从不做任何异步的事情(即从不使用wait
)。
但是,问题是如何在
foo
的代码中包装/修改/调用常规函数bar
,以便等待bar
。如果需要,只需将同步函数包装为:
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)()
这似乎有效。请注意,有趣的是,
asyncio.coroutine(normal\u function)(
是一个生成器,而a\u coroutine\u function()
是一个协同例程。是否有任何方法将此返回的生成器对象视为一个任务对象,例如调用Task.done()
并查看它是否仍在运行?。文档中说要使用async def
,但将函数转换为协同程序的未来可靠方法是什么?