異步
對于輸入/輸出(IO)系結,我們需要使用異步代碼,默認情況下 django 不是異步的,但是我們可以使用gevent worker 和monkey patching來實作這個運行的 gunicorn :
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:
修復:猴子補丁現在在工人中完成
- 我還需要修補我的應用程式還是默認情況下由作業人員完成?
- gevent 如何為我的 Django 代碼實作異步功能?
執行緒
如果我們有一個 CPU 限制,我們需要使用一個帶有執行緒的gthread worker:
gunicorn --workers=5 --threads=2 --worker-class=gthread main:app
- 如果我們將這個配置用于 i/o 系結,它是否有效?當一個執行緒因為 i/o 而等待時,另一個執行緒是否能夠作業?
- 由于 i/o 中的等待時間,我在 (3) 中看到了這一點(如果我是對的),但是如果這是 CPU 限制,那么在我們的情況下,第二個執行緒將如何幫助我們,或者僅在以下情況下才有所幫助核心沒有被一個執行緒完全加載,還有空間讓另一個執行緒運行?
- (3) 和 (4) 是不是因為 GIL 沒用?
例如,4 個人使用 1 個作業執行緒和 4 個執行緒向服務器發送請求。GIL 確保只有 1 個執行緒有效。第一個開始處理執行緒 1,其他 3 個正在等待?那么執行緒是做什么用的呢?
uj5u.com熱心網友回復:
我還需要修補我的應用程式還是默認情況下由作業人員完成?
無需修補代碼中的任何內容。根本不需要修改代碼。gevent 如何為我的 Django 代碼實作異步功能?
gunicorn修補一切。如果我們將這個配置用于 i/o 系結,它是否有效?當一個執行緒因為 i/o 而等待時,另一個執行緒是否能夠作業?
此配置適用于 i/o 系結。執行緒可以隨時在自己之間切換(切換最終由作業系統控制),無論當前執行緒是在執行 I/O 還是 CPU 密集型計算。多個執行緒可以在多執行緒 CPU 上同時作業。相比之下,greenlets 更像是協程而不是執行緒。如果一個協程被 I/O 阻塞,它會主動允許另一個協程控制 CPU 并做非 I/O 的事情。由于 i/o 中的等待時間,我在 (3) 中看到了這一點(如果我是對的),但是如果這是 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 約束,但可能與您的代碼不兼容。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/399902.html
上一篇:如何正確使用佇列和執行緒
