【问题标题】:Gunicorn async and threaded workers for djangodjango 的 Gunicorn 异步和线程工作者
【发布时间】:2021-12-27 06:49:55
【问题描述】:

异步

对于输入/输出(IO)绑定,我们需要使用异步代码,而 django 默认不是异步的,但是我们可以通过 gevent 工作程序和 monkey patching:

gunicorn --worker-class=gevent --worker-connections=1000 --workers=3 main:app

2014 年的 Gunicorn 更新日志https://docs.gunicorn.org/en/stable/2014-news.html?highlight=monkey#gevent-worker

修复:猴子补丁现在在工作人员中完成

  1. 我是否仍需要对我的应用程序进行猴子修补,或者它是由工作人员默认完成的?
  2. gevent 如何为我的 django 代码实现异步功能?

线程

如果我们的 CPU 受限,我们需要使用带有线程的 gthread 工作者:

gunicorn --workers=5 --threads=2 --worker-class=gthread main:app
  1. 如果我们将此配置用于 i/o 绑定,它是否有效?当一个线程因为 i/o 等待时,另一个线程能工作吗?
  2. 由于 i/o 中的等待时间,我看到了 (3) 中的要点(如果我是对的),但如果这是一个 CPU 限制,那么在我们的情况下,第二个线程将如何帮助我们,或者只会如果核心没有被一个线程完全加载并且还有空间让另一个线程运行,是否有帮助?
  3. (3) 和 (4) 是否因为 GIL 而无用?
    例如,4 个人使用 1 个工作线程和 4 个线程向服务器发送请求。 GIL 确保只有 1 个线程有效。第一个人开始处理线程 1 和其他 3 正在等待?那么线程是干什么用的呢?

【问题讨论】:

    标签: python django multithreading asynchronous gunicorn


    【解决方案1】:
    1. 我是否仍需要对我的应用程序进行猴子修补,还是默认情况下由工作人员完成?
      无需修补代码中的任何内容。完全不需要修改代码。

    2. gevent 如何为我的 django 代码实现异步功能?
      gunicorn 修补所有内容。

    3. 如果我们将此配置用于 i/o 绑定,它是否有效?当一个线程因为 i/o 等待时,另一个线程还能工作吗?
      此配置适用于 i/o 绑定。线程可以随时在它们自己之间切换(切换最终由操作系统控制),无论当前线程是在执行 I/O 还是 CPU 密集型计算。多个线程可以在多线程 CPU 上同时工作。相比之下,greenlets 更多的是协程而不是线程。如果一个协程被 I/O 阻塞,它会主动允许另一个协程控制 CPU 并执行非 I/O 操作。

    4. 由于 i/o 中的等待时间,我看到了 (3) 中的要点(如果我是对的),但如果这是 CPU 限制,那么在我们的情况下,第二个线程将如何帮助我们,或者它只会帮助我们如果核心没有被一个线程完全加载并且还有空间让另一个线程运行,是否有帮助?
      对于单线程 CPU 上的纯 CPU 受限任务,额外的线程几乎没有意义。

    5. (3)和(4)是否因为 GIL 而无用?
      GIL 禁止你的 Python 代码同时运行,但 gunicorn 主要使用不是用 Python 编写的库。您不能使用多个线程运行 Django 代码(在 Python 中),但 I/O 任务(由 gunicorn 处理,而不是在 Python 中)可能会同时进行。如果您确实需要 CPU 利用率,请使用多个进程 (workers=2 * CPU_THREADS + 1) 而不是多个 gthread,或者考虑使用非 CPython 解释器,例如 pypy,它不受 GIL 限制,但可能与您的代码不兼容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-20
      • 2015-06-14
      • 2015-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-23
      • 2016-04-22
      相关资源
      最近更新 更多