32

我目前正在 Django 中开发一项服务,该服务使用缓慢的外部 API(大约需要 10 秒才能得到响应),这意味着与我的服务器的连接保持打开状态等待外部 API 响应,并占用工作人员时间/资源。

我知道我可以使用 gunicorn 的线程或 gevent 工作者来添加并发性,但似乎无法掌握将 gunicorn 与 gevent 工作者和 uvicorn (或任何其他服务器)与 asgi 接口一起使用之间的确切区别。

使用其中一个的标准是什么?

Django 仍然不完全支持 async/await 视图。如果我只坚持 gevent 工人会更好吗?

4

1 回答 1

13

Gunicorn 有一个 pre-fork worker 模型

pre-fork worker 模型基本上意味着 master 创建处理每个请求的 fork。fork 是一个完全独立的 *nix 进程(Source)。

Uvicorn 是一个运行 uvloop 的 ASGI 服务器

Python async 需要一个事件循环才能使用它的异步功能。并且uvloopasyncio loop的替代方案。因此,如果您的代码中有异步调用,您可以在uvloop内部使用或uvicorn用作您的 ASGI 服务器。注意:您仍然只有一个事件循环。您可以选择使用gunicornuvicorn拥有多个工作人员并使用 uvloop。

uvloop在您的 django 应用程序中,内部使用(如果您选择)并gunicorn用作您的 ASGI是有意义的。

于 2020-10-23T03:15:19.673 回答