如何使用asyncio连接阻塞和非阻塞代码

lee*_*ech 7 python-asyncio

我正在尝试在事件循环之外使用协程函数.(在这种情况下,我想在Django中调用一个也可以在事件循环中使用的函数)

如果不将调用函数作为协程,似乎没有办法做到这一点.

我意识到Django是为了阻塞而构建的,因此与asyncio不兼容.虽然我认为这个问题可能会帮助那些正在进行转换或使用遗留代码的人.

就此而言,它可能有助于理解异步编程以及为什么它不能用于阻塞代码.

lee*_*ech 2

经过大量研究后,我认为这些解决方案可能会有所帮助:

  1. 更新您的旧代码以使用 asyncio

    是的,我知道这可能很艰难和痛苦,但这可能是最明智的选择。如果您想像我一样使用 Django...那么,您需要做很多工作才能使 Django 异步。我不确定这是否可能,但我至少发现了一次尝试:https://github.com/aaugustin/django-c10k-demo(不过,在 YouTube 视频中,作者解释了此方法的所有缺点)。

  2. 使用 asyncio.async 或 asyncio.Task

    这些项目将使您能够在阻塞代码内运行一些异步内容,但这里的缺点是您将无法等待它们完成而不做一些丑陋的事情,例如检查未来是否已完成的 while 循环...呃,但如果您不需要结果,那可能对您有用。