Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
core/uwsgi: graceful stop worker when max_requests/reload_on_*
worker stops when reached max_requests or reload_on_*. https://github.com/unbit/uwsgi/blob/39f3ade88c88693f643e70ecf6c36f9b375f00a2/core/utils.c#L1216-L1251 `goodbye_cruel_world()` is not graceful. It caused `atexit` not called. If atexit stops daemon threads, worker won't stop until killed from master. Using a reproducer similar to tests/threads_atexit.py: *** uWSGI is running in multiple interpreter mode *** spawned uWSGI master process (pid: 93920) spawned uWSGI worker 1 (pid: 93921, cores: 80) ...The work of process 93921 is done (max requests reached (641 >= 20)). Seeya! worker 1 killed successfully (pid: 93921) Respawned uWSGI worker 1 (new pid: 94019) ...The work of process 94019 is done (max requests reached (721 >= 20)). Seeya! worker 1 killed successfully (pid: 94019) Respawned uWSGI worker 1 (new pid: 94099) ...The work of process 94099 is done (max requests reached (721 >= 20)). Seeya! worker 1 killed successfully (pid: 94099) Respawned uWSGI worker 1 (new pid: 94179) ...The work of process 94179 is done (max requests reached (721 >= 20)). Seeya! worker 1 killed successfully (pid: 94179) Respawned uWSGI worker 1 (new pid: 94260) ...The work of process 94260 is done (max requests reached (721 >= 20)). Seeya! worker 1 killed successfully (pid: 94260) Respawned uWSGI worker 1 (new pid: 94340) atexit is not called. *** uWSGI is running in multiple interpreter mode *** spawned uWSGI master process (pid: 94781) spawned uWSGI worker 1 (pid: 94782, cores: 80) ...The work of process 94782 is done (max requests reached (402 >= 20)). Seeya! on_exit: uwsgi.worker_id()=1 worker 1 killed successfully (pid: 94782) Respawned uWSGI worker 1 (new pid: 94880) ...The work of process 94880 is done (max requests reached (721 >= 20)). Seeya! on_exit: uwsgi.worker_id()=1 worker 1 killed successfully (pid: 94880) Respawned uWSGI worker 1 (new pid: 94960) ...The work of process 94960 is done (max requests reached (721 >= 20)). Seeya! on_exit: uwsgi.worker_id()=1 worker 1 killed successfully (pid: 94960) Respawned uWSGI worker 1 (new pid: 95040) ...The work of process 95040 is done (max requests reached (721 >= 20)). Seeya! on_exit: uwsgi.worker_id()=1 worker 1 killed successfully (pid: 95040) Respawned uWSGI worker 1 (new pid: 95120) ...The work of process 95120 is done (max requests reached (721 >= 20)). Seeya! on_exit: uwsgi.worker_id()=1 worker 1 killed successfully (pid: 95120) Respawned uWSGI worker 1 (new pid: 95200) atexit is called Related issue: open-telemetry/opentelemetry-python#3640
- Loading branch information