Reconcile the Frappe-specific gthread changes with upstream's major
26.0.0 release (HTTP/2, ASGI, lock-free main-thread event loop).
Conflict resolution:
- gunicorn/workers/gthread.py: reimplemented our features on top of
upstream's rewritten event loop instead of merging line-by-line:
- Per-request timeout + faulthandler traceback dump, tracked via an
in-flight future set and keyed on exec_start_time so client-wait
time (upstream's _DEFER path) is excluded and long-lived HTTP/2
connections are exempt.
- Adaptive slow/fast-lane queueing: the request-line peek/classify
now reuses upstream's pending_conns poller-park mechanism, then
dispatches to a fast or slow ThreadPoolExecutor.
- Dropped our eventfd-based shutdown wakeup in favour of upstream's
PollableMethodQueue.defer(), which already wakes the poller on
SIGTERM.
- gunicorn/config.py: kept both new validators; our EnableAdaptiveQueueing
and SlowRequestThreshold settings merged cleanly.
- README.rst was removed upstream (converted to README.md); ported an
updated Fork Information section into README.md.
- tox.ini / .github/workflows/tox.yml: took upstream's Python matrix
(it already drops the EoL versions our fork had pruned).
All gthread + routing tests pass (91), full suite 1976 passed / 263
skipped.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4.5 KiB
Fork Information
This is a fork of gunicorn with the following Frappe-specific changes to the
gthread worker:
- Request timeout for
gthread— upstream has no per-request timeout; a slow request can otherwise tie up a thread indefinitely. See https://github.com/frappe/gunicorn/pull/1 - Traceback dump on timeout — when a request times out we
faulthandler.dump_traceback()before exiting, to aid debugging. See https://github.com/frappe/gunicorn/pull/6 - Adaptive slow/fast-lane queueing — when
enable_adaptive_queueingis set, the configured threads are split into a fast lane and a slow lane so slow requests cannot starve fast ones. Controlled by--enable-adaptive-queueing/GUNICORN_ENABLE_ADAPTIVE_QUEUEINGand--slow-request-threshold. Seegunicorn/workers/gthread_routing.py. - Higher selector timeout — small optional throughput improvement. See https://github.com/frappe/gunicorn/pull/2
Note to anyone upgrading / adding changes:
- Pull upstream changes.
- Reapply or reconcile our changes (the work lives in
gunicorn/workers/gthread.py,gunicorn/workers/gthread_routing.pyandgunicorn/config.py). - Update the commit/ref in frappe/frappe
pyproject.toml. - Keep this section up to date. Keep changes small and to the point.
TODO:
- Plan a cleaner solution using custom workers. All current changes could live in a custom worker, but that carries the same awkwardness of maintaining a fork since we want to "override" rather than "extend" core behaviour.
Gunicorn
Gunicorn is maintained by volunteers. If it powers your production, please consider supporting us:
Gunicorn 'Green Unicorn' is a Python WSGI HTTP Server for UNIX. It's a pre-fork worker model ported from Ruby's Unicorn project. The Gunicorn server is broadly compatible with various web frameworks, simply implemented, light on server resource usage, and fairly speedy.
New in v25: Per-app worker allocation for dirty arbiters, HTTP/2 support (beta)!
Quick Start
pip install gunicorn
gunicorn myapp:app --workers 4
For ASGI applications (FastAPI, Starlette):
gunicorn myapp:app --worker-class asgi
Features
- WSGI support for Django, Flask, Pyramid, and any WSGI framework
- ASGI support for FastAPI, Starlette, Quart
- HTTP/2 support (beta) with multiplexed streams
- Dirty Arbiters (beta) for heavy workloads (ML models, long-running tasks)
- uWSGI binary protocol for nginx integration
- Multiple worker types: sync, gthread, gevent, asgi
- Graceful worker process management
- Compatible with Python 3.9+
Documentation
Full documentation at https://gunicorn.org
Community
- Report bugs on GitHub Issues
- Chat in #gunicorn on Libera.chat
- See CONTRIBUTING.md for contribution guidelines
Support
Powering Python apps since 2010. Support continued development.
Sponsors
License
Gunicorn is released under the MIT License. See the LICENSE file for details.