From bc61315377056fe362b744d9c44e17cd3178ce54 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 22 Aug 2017 16:50:42 +0200 Subject: [PATCH] bpo-31249: Fix ref cycle in ThreadPoolExecutor (#3178) * bpo-31249: Fix ref cycle in ThreadPoolExecutor concurrent.futures: WorkItem.run() used by ThreadPoolExecutor now breaks a reference cycle between an exception object and the WorkItem object. ThreadPoolExecutor.shutdown() now also clears its threads set. * shutdown() now only clears threads if wait is true. * Revert changes on shutdown() --- Lib/concurrent/futures/thread.py | 6 ++++-- .../next/Library/2017-08-22-12-44-48.bpo-31249.STPbb9.rst | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2017-08-22-12-44-48.bpo-31249.STPbb9.rst diff --git a/Lib/concurrent/futures/thread.py b/Lib/concurrent/futures/thread.py index 1f0a1d4b977..0b5d5373ffd 100644 --- a/Lib/concurrent/futures/thread.py +++ b/Lib/concurrent/futures/thread.py @@ -54,8 +54,10 @@ class _WorkItem(object): try: result = self.fn(*self.args, **self.kwargs) - except BaseException as e: - self.future.set_exception(e) + except BaseException as exc: + self.future.set_exception(exc) + # Break a reference cycle with the exception 'exc' + self = None else: self.future.set_result(result) diff --git a/Misc/NEWS.d/next/Library/2017-08-22-12-44-48.bpo-31249.STPbb9.rst b/Misc/NEWS.d/next/Library/2017-08-22-12-44-48.bpo-31249.STPbb9.rst new file mode 100644 index 00000000000..f11a66802d1 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2017-08-22-12-44-48.bpo-31249.STPbb9.rst @@ -0,0 +1,2 @@ +concurrent.futures: WorkItem.run() used by ThreadPoolExecutor now breaks a +reference cycle between an exception object and the WorkItem object.