2026-01-15
HTMX+Gunicornではワーカーをgthreadにする
現象:
HTMX を使っているWebアプリを Gunicorn で実行していると、最初はきちんと動作するが、しばらく使っているとクリックしても反応がなくなる。 1分ほど放っておくと動作するようになる。
相性問題もあり、Windows 11のEdgeのみで発生し、Google Chromeでは発生しない。
ログを確認するとGunicornのワーカーがタイムアウトしている。
web_1 | [2026-01-15 17:31:41 +0900] [1] [INFO] Starting gunicorn 23.0.0 web_1 | [2026-01-15 17:31:41 +0900] [1] [INFO] Listening at: http://0.0.0.0:8000 (1) web_1 | [2026-01-15 17:31:41 +0900] [1] [INFO] Using worker: sync web_1 | [2026-01-15 17:31:41 +0900] [6] [INFO] Booting worker with pid: 6 web_1 | [2026-01-15 17:32:24 +0900] [1] [CRITICAL] WORKER TIMEOUT (pid:6) web_1 | [2026-01-15 08:32:24 +0000] [6] [ERROR] Error handling request (no URI read) web_1 | Traceback (most recent call last): web_1 | File "/usr/local/lib/python3.12/site-packages/gunicorn/workers/sync.py", line 133, in handle web_1 | req = next(parser) web_1 | ^^^^^^^^^^^^
原因:
GunicornのデフォルトワーカーであるSync Workerが接続の中断に弱く、HTMX のように細かい非同期リクエストが多く発生する環境ではタイムアウトになりやすいため。
解決策:
Gunicornのワーカーをgthreadに変更する。
gunicorn --worker-class gthread