从同步函数调用异步函数,而同步函数继续:Python

新手上路,请多包涵

在仔细阅读了 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 许可协议

阅读 1.1k
1 个回答

asyncio 不使用线程就不能“在后台”运行任意代码。正如 user4815162342 所 指出的 asyncio 您运行的事件循环会阻塞主线程并管理协程的执行。

如果您想使用 asyncio 并利用它,您应该重写所有使用协程的函数,使其成为协程,直到主函数 - 程序的入口点。这个主协程通常传递给 run_until_complete 。这篇 小文章 更详细地揭示了这个主题。


由于您对 Flask 感兴趣,请看一下 Quart :它是一个 Web 框架,它试图根据 asyncio 来实现 Flask API(尽可能多)。这个项目存在的原因是因为纯 Flask 与 asyncio 不兼容。 Quart 是为了兼容而编写的。

如果你想继续使用纯 Flask,但有异步的东西,看看 gevent 。通过猴子修补,它可以使您的代码异步。尽管此解决方案有其自身的问题(这就是创建 asyncio 的原因)。

原文由 Mikhail Gerasimov 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进