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

时间:2014-05-27 20:30:42

标签: python-asyncio

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

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

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

就此而言,它可能有助于理解异步编程和为什么它不能用于阻止代码。

2 个答案:

答案 0 :(得分:1)

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

  1. 更新旧版代码以使用asyncio

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

  2. 使用asyncio.async或asyncio.Task

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

答案 1 :(得分:1)

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