]> git.ipfire.org Git - thirdparty/Python/cpython.git/commit
bpo-39360: Ensure all workers exit when finalizing a multiprocessing Pool (GH-19009)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Sun, 15 Mar 2020 21:26:43 +0000 (14:26 -0700)
committerGitHub <noreply@github.com>
Sun, 15 Mar 2020 21:26:43 +0000 (14:26 -0700)
commit7f5302fed4ff0cc8042e639b29a0664a16bc2702
tree8826b850ac54fbd81eb10c6b2b049daab8442bc6
parent890dcfe4035888f70207eaac05662d6e29606214
bpo-39360: Ensure all workers exit when finalizing a multiprocessing Pool (GH-19009)

When the pull is not used via the context manager or terminate() is called, there is a system in multiprocessing.util that handles finalization of all pools via an atexit handler (the Finalize) class. This class registers the _terminate_pool handler in the registry of finalizers of the module, and that registry is called on interpreter exit via _exit_function. The problem is that the "happy" path with the context manager or manual call to finalize() does some extra steps that _terminate_pool does not. The step that is not executed when the atexit() handler calls _terminate_pool is pinging the _change_notifier queue to unblock the maintenance threads.

This commit moves the notification to the _terminate_pool function so is called from both code paths.

Co-authored-by: Pablo Galindo <Pablogsal@gmail.com>
(cherry picked from commit ac10e0c93218627d1a639db0b7b41714c5f6a883)

Co-authored-by: Batuhan Taşkaya <47358913+isidentical@users.noreply.github.com>
Lib/multiprocessing/pool.py
Lib/test/_test_multiprocessing.py
Misc/NEWS.d/next/Library/2020-03-15-05-41-05.bpo-39360.cmcU5p.rst [new file with mode: 0644]