首页 文章

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

提问于
浏览
7

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

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

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

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

2 回答

  • 1

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

    • Update your legacy code to use asyncio

    是的,我知道这可能是艰难和痛苦的,但它可能是最安全的选择 . 如果你想像我一样想要使用Django ......好吧,你've got a lot of work to do to make Django async' d . 我不确定这是否可能,但我发现至少有一次尝试:https://github.com/aaugustin/django-c10k-demo(尽管如此,在YouTube视频中,作者解释了这一点的所有缺点) .

    • use asyncio.async or asyncio.Task

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

  • 1

    关于案例#2:阻止代码至少应该包含.run_in_executor .

相关问题