summaryrefslogtreecommitdiffstats
path: root/Lib/multiprocessing
diff options
context:
space:
mode:
authorAntoine Pitrou <pitrou@free.fr>2017-03-24 12:52:11 (GMT)
committerGitHub <noreply@github.com>2017-03-24 12:52:11 (GMT)
commit8988945cdc27ffa86ba8c624e095b51c459f5154 (patch)
tree3dd4f0619935cca2a0556f0a9cac10ff0aa6b678 /Lib/multiprocessing
parente304e33c16e060932d1e2cc8a030d42b02b429b5 (diff)
downloadcpython-8988945cdc27ffa86ba8c624e095b51c459f5154.zip
cpython-8988945cdc27ffa86ba8c624e095b51c459f5154.tar.gz
cpython-8988945cdc27ffa86ba8c624e095b51c459f5154.tar.bz2
bpo-29861: release references to multiprocessing Pool tasks (#743)
* bpo-29861: release references to multiprocessing Pool tasks Release references to tasks, their arguments and their results as soon as they are finished, instead of keeping them alive until another task arrives. * Comments in test
Diffstat (limited to 'Lib/multiprocessing')
-rw-r--r--Lib/multiprocessing/pool.py7
1 files changed, 6 insertions, 1 deletions
diff --git a/Lib/multiprocessing/pool.py b/Lib/multiprocessing/pool.py
index ffdf426..ae8cec4 100644
--- a/Lib/multiprocessing/pool.py
+++ b/Lib/multiprocessing/pool.py
@@ -128,6 +128,8 @@ def worker(inqueue, outqueue, initializer=None, initargs=(), maxtasks=None,
util.debug("Possible encoding error while sending result: %s" % (
wrapped))
put((job, i, (False, wrapped)))
+
+ task = job = result = func = args = kwds = None
completed += 1
util.debug('worker exiting after %d tasks' % completed)
@@ -402,10 +404,11 @@ class Pool(object):
if set_length:
util.debug('doing set_length()')
set_length(i+1)
+ finally:
+ task = taskseq = job = None
else:
util.debug('task handler got sentinel')
-
try:
# tell result handler to finish when cache is empty
util.debug('task handler sending sentinel to result handler')
@@ -445,6 +448,7 @@ class Pool(object):
cache[job]._set(i, obj)
except KeyError:
pass
+ task = job = obj = None
while cache and thread._state != TERMINATE:
try:
@@ -461,6 +465,7 @@ class Pool(object):
cache[job]._set(i, obj)
except KeyError:
pass
+ task = job = obj = None
if hasattr(outqueue, '_reader'):
util.debug('ensuring that outqueue is not full')