Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save knwng/a9ad39fd58ed7d1cf21713e0ed58807e to your computer and use it in GitHub Desktop.
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.
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