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
,但将函数转换为协同程序的未来可靠方法是什么?