在仔细阅读了 AsyncIO
和文章之后,我仍然找不到答案: 异步运行函数(不使用线程)并确保调用此异步函数的函数继续执行。
伪代码:
async def functionAsync(p):
#...
#perform intensive calculations
#...
print ("Async loop done")
def functionNormal():
p = ""
functionAsync(p)
return ("Main loop ended")
print ("Start Code")
print functionNormal()
预期输出:
Start code
Main loop ended
Async loop done
搜索示例,其中使用了 loop.run_until_complete
,但不会返回 functionNormal()
的打印值,因为它本质上是阻塞的。
原文由 Shivansh Jagga 发布,翻译遵循 CC BY-SA 4.0 许可协议
asyncio
不使用线程就不能“在后台”运行任意代码。正如 user4815162342 所 指出的asyncio
您运行的事件循环会阻塞主线程并管理协程的执行。如果您想使用
asyncio
并利用它,您应该重写所有使用协程的函数,使其成为协程,直到主函数 - 程序的入口点。这个主协程通常传递给run_until_complete
。这篇 小文章 更详细地揭示了这个主题。由于您对 Flask 感兴趣,请看一下 Quart :它是一个 Web 框架,它试图根据
asyncio
来实现 Flask API(尽可能多)。这个项目存在的原因是因为纯 Flask 与asyncio
不兼容。 Quart 是为了兼容而编写的。如果你想继续使用纯 Flask,但有异步的东西,看看 gevent 。通过猴子修补,它可以使您的代码异步。尽管此解决方案有其自身的问题(这就是创建
asyncio
的原因)。