Forked from hynek/gunicorn_callbacks_for_worker_id.py
Last active
February 16, 2023 09:14
-
-
Save knwng/a9ad39fd58ed7d1cf21713e0ed58807e to your computer and use it in GitHub Desktop.
This is an attempt to emulate uWSGI’s uwsgi.worker_id() that ensures that I have worker IDs from 1…--workers which is useful in logging and instrumentation where changing PIDs are annoying.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def on_starting(server): | |
setattr(server, '_worker_id_set', set()) | |
def _next_worker_id(server): | |
if hasattr(server, '_worker_id_set') and isinstance(server._worker_id_set, set) and len(server._worker_id_set) > 0: | |
return server._worker_id_set.pop() | |
in_use = set(w._worker_id for w in tuple(server.WORKERS.values()) if hasattr(w, '_worker_id') and w.alive) | |
free = set(range(1, server.num_workers + 1)) - in_use | |
return free.pop() | |
def on_reload(server): | |
setattr(server, '_worker_id_set', set(range(1, server.num_workers + 1))) | |
def pre_fork(server, worker): | |
# Attach worker_id to worker before forking | |
setattr(worker, '_worker_id', _next_worker_id(server)) | |
def post_fork(server, worker): | |
# Pass worker_id through env after forking | |
os.environ[ENV_VAR_APP_WORKER_ID] = str(getattr(worker, '_worker_id', 0)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment