Skip to content

bpo-39360: Ensure all workers exit when finalizing a multiprocessing Pool#19009

Merged
pablogsal merged 4 commits into
python:masterfrom
isidentical:bpo-39360
Mar 15, 2020
Merged

bpo-39360: Ensure all workers exit when finalizing a multiprocessing Pool#19009
pablogsal merged 4 commits into
python:masterfrom
isidentical:bpo-39360

Conversation

@isidentical

@isidentical isidentical commented Mar 15, 2020

Copy link
Copy Markdown
Member

Comment thread Misc/NEWS.d/next/Library/2020-03-15-05-41-05.bpo-39360.cmcU5p.rst Outdated
Comment thread Lib/test/_test_multiprocessing.py Outdated
Comment thread Lib/test/_test_multiprocessing.py Outdated
Co-Authored-By: Pablo Galindo <Pablogsal@gmail.com>
@pablogsal pablogsal self-assigned this Mar 15, 2020
@pablogsal pablogsal added the type-bug An unexpected behavior, bug, or error label Mar 15, 2020
@isidentical
isidentical force-pushed the bpo-39360 branch 5 times, most recently from b1a94ba to 13aa61f Compare March 15, 2020 10:21
@pablogsal
pablogsal merged commit ac10e0c into python:master Mar 15, 2020
@miss-islington

Copy link
Copy Markdown
Contributor

Thanks @isidentical for the PR, and @pablogsal for merging it 🌮🎉.. I'm working now to backport this PR to: 3.8.
🐍🍒⛏🤖

miss-islington pushed a commit to miss-islington/cpython that referenced this pull request Mar 15, 2020
…Pool (pythonGH-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 ac10e0c)

Co-authored-by: Batuhan Taşkaya <47358913+isidentical@users.noreply.github.com>
@bedevere-bot

Copy link
Copy Markdown

GH-19023 is a backport of this pull request to the 3.8 branch.

miss-islington added a commit that referenced this pull request Mar 15, 2020
…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 ac10e0c)

Co-authored-by: Batuhan Taşkaya <47358913+isidentical@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

type-bug An unexpected behavior, bug, or error

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants