From 9c204b148fad9742ed19b3bce173073cdec79819 Mon Sep 17 00:00:00 2001 From: themylogin Date: Mon, 2 May 2022 22:24:39 +0200 Subject: bpo-46787: Fix `ProcessPoolExecutor exception` memory leak (GH-31408) (#31408) Do not store `ProcessPoolExecutor` work item exception traceback that prevents exception frame locals from being garbage collected. --- Lib/concurrent/futures/process.py | 3 +++ Misc/NEWS.d/next/Library/2022-02-18-20-09-29.bpo-46787.juwWc0.rst | 1 + 2 files changed, 4 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2022-02-18-20-09-29.bpo-46787.juwWc0.rst diff --git a/Lib/concurrent/futures/process.py b/Lib/concurrent/futures/process.py index 695f773..0d49379c 100644 --- a/Lib/concurrent/futures/process.py +++ b/Lib/concurrent/futures/process.py @@ -125,6 +125,9 @@ class _ExceptionWithTraceback: def __init__(self, exc, tb): tb = ''.join(format_exception(type(exc), exc, tb)) self.exc = exc + # Traceback object needs to be garbage-collected as its frames + # contain references to all the objects in the exception scope + self.exc.__traceback__ = None self.tb = '\n"""\n%s"""' % tb def __reduce__(self): return _rebuild_exc, (self.exc, self.tb) diff --git a/Misc/NEWS.d/next/Library/2022-02-18-20-09-29.bpo-46787.juwWc0.rst b/Misc/NEWS.d/next/Library/2022-02-18-20-09-29.bpo-46787.juwWc0.rst new file mode 100644 index 0000000..cf167ff --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-02-18-20-09-29.bpo-46787.juwWc0.rst @@ -0,0 +1 @@ +Fix :class:`concurrent.futures.ProcessPoolExecutor` exception memory leak -- cgit v0.12