Lib*_*ain 5 python django multithreading asynchronous gunicorn
对于输入/输出(IO)绑定,我们需要使用异步代码,而 django 默认情况下不是异步的,但我们可以通过gevent工作线程和猴子修补来实现运行 Gunicorn :
gunicorn --worker-class=gevent --worker-connections=1000 --workers=3 main:app
Run Code Online (Sandbox Code Playgroud)
2014 年的 Gunicorn 变更日志https://docs.gunicorn.org/en/stable/2014-news.html?highlight=monkey#gevent-worker:
修复:猴子补丁现在在工作人员中完成
如果我们有 CPU 限制,我们需要使用带有线程的gthread工作线程:
gunicorn --workers=5 --threads=2 --worker-class=gthread main:app
Run Code Online (Sandbox Code Playgroud)
我是否仍然需要对我的应用程序进行猴子修补,或者默认情况下是由工作人员完成的?
无需修补代码中的任何内容。根本不需要修改代码。
gevent 如何为我的 django 代码实现异步功能?
gunicorn修补一切。
如果我们使用此配置进行 I/O 绑定,它可以工作吗?当一个线程因为I/O而等待时,另一个线程还能工作吗?
此配置适用于 I/O 绑定。线程可以随时在它们之间进行切换(切换最终由操作系统控制),无论当前线程是在执行 I/O 还是 CPU 密集型计算。多个线程可以在多线程 CPU 上同时工作。相比之下,greenlet 更多的是协程而不是线程。如果某个协程被 I/O 阻塞,它会主动允许另一个协程控制 CPU 并执行非 I/O 操作。
我明白了 (3) 中的要点(如果我是对的),因为 i/o 中的等待时间,但如果这是 CPU 限制,那么在我们的例子中,第二个线程将如何帮助我们,或者仅在以下情况下才有帮助:一个线程未完全加载核心,并且还有空间供另一个线程运行?
对于单线程 CPU 上纯粹受 CPU 限制的任务,额外的线程没有什么意义。
(3)和(4)因为GIL就没用了吗?
GIL 禁止你的 Python 代码同时运行,但是gunicorn 主要使用不是用 Python 编写的库。您无法使用多个线程运行 Django 代码(在 Python 中),但 I/O 任务(由 Gunicorn 处理,而不是在 Python 中)可以同时进行。如果您确实需要 CPU 利用率,请使用多个进程 ( workers=2 * CPU_THREADS + 1) 而不是多个 gthread,或者考虑非 CPython 解释器,例如pypy,它不受 GIL 约束,但可能与您的代码不兼容。
| 归档时间: |
|
| 查看次数: |
9150 次 |
| 最近记录: |