]> git.ipfire.org Git - thirdparty/Python/cpython.git/commit
[3.14] gh-115634: Fix ProcessPoolExecutor deadlock with max_tasks_per_child (GH-14090...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Fri, 3 Jul 2026 06:35:47 +0000 (08:35 +0200)
committerGitHub <noreply@github.com>
Fri, 3 Jul 2026 06:35:47 +0000 (06:35 +0000)
commit42f81fa7a6c523019907dfda733359e0e7602f62
treeeb497fe4fbb526c453f5f8f490fc6c8e0731cc39
parent8a2e34c9e002d85d81ed0f1c92cf7ed5c99a04ae
[3.14] gh-115634: Fix ProcessPoolExecutor deadlock with max_tasks_per_child (GH-140900) (#152927)

gh-115634: Fix ProcessPoolExecutor deadlock with max_tasks_per_child (GH-140900)

The idle worker semaphore counts task completions, not idle workers, so
it can hold a stale token released by a worker that later exited upon
reaching its max_tasks_per_child limit. The worker replacement path
consumed such tokens and skipped spawning a replacement, deadlocking
the remaining queued tasks once no workers were left.

Replace dead workers based on len(self._processes) without consulting
the semaphore. The submit() path is unchanged, preserving on-demand
spawning and idle worker reuse.

Replace the documentation note added in GH-140897 with a versionchanged
entry now that the bug is fixed.

Based on a fix proposed by Tabrez Mohammed.
(cherry picked from commit b706767d8fd7d21afc3f156fb9c173bc99855e0e)

Co-authored-by: Gregory P. Smith <68491+gpshead@users.noreply.github.com>
Doc/library/concurrent.futures.rst
Lib/concurrent/futures/process.py
Lib/test/test_concurrent_futures/test_process_pool.py
Misc/NEWS.d/next/Library/2025-11-02-05-28-56.gh-issue-115634.JbcNnF.rst [new file with mode: 0644]