7

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

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

我意识到 Django 是为阻塞而构建的,因此与 asyncio 不兼容。尽管我认为这个问题可能会帮助正在过渡或使用遗留代码的人。

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

4

2 回答 2

1

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

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

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

  2. 使用 asyncio.async 或 asyncio.Task

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

于 2014-06-05T20:40:49.453 回答
1

关于案例 #2:阻塞代码至少应该用 .run_in_executor 包裹。

于 2017-11-08T14:10:33.903 回答