diff -r 04ff1cc40d62 Doc/library/multiprocessing.rst
--- a/Doc/library/multiprocessing.rst Fri Oct 04 11:38:59 2013 -0400
+++ b/Doc/library/multiprocessing.rst Sat Oct 05 20:27:46 2013 +0300
@@ -1785,7 +1785,7 @@
One can create a pool of processes which will carry out tasks submitted to it
with the :class:`Pool` class.
-.. class:: Pool([processes[, initializer[, initargs[, maxtasksperchild]]]])
+.. class:: Pool([processes[, initializer[, initargs[, maxtasksperchild[, queuesizelimit]]]]])
A process pool object which controls a pool of worker processes to which jobs
can be submitted. It supports asynchronous results with timeouts and
@@ -1805,6 +1805,12 @@
unused resources to be freed. The default *maxtasksperchild* is None, which
means worker processes will live as long as the pool.
+ .. versionadded:: 3.4
+ *queuesizelimit* is the amount of tasks which can be queued into the pool's buffer.
+ Once the buffer is filled up, all the subsequent asynchronous calls will be blocking
+ until the buffer is not freed by the workers, a value less than or equal to zero will
+ set an infinite size. By default the queue size is unlimited.
+
.. note::
Worker processes within a :class:`Pool` typically live for the complete
diff -r 04ff1cc40d62 Lib/multiprocessing/__init__.py
--- a/Lib/multiprocessing/__init__.py Fri Oct 04 11:38:59 2013 -0400
+++ b/Lib/multiprocessing/__init__.py Sat Oct 05 20:27:46 2013 +0300
@@ -202,12 +202,12 @@
from .queues import SimpleQueue
return SimpleQueue()
-def Pool(processes=None, initializer=None, initargs=(), maxtasksperchild=None):
+def Pool(processes=None, initializer=None, initargs=(), maxtasksperchild=None, maxqueuesize=0):
'''
Returns a process pool object
'''
from .pool import Pool
- return Pool(processes, initializer, initargs, maxtasksperchild)
+ return Pool(processes, initializer, initargs, maxtasksperchild, maxqueuesize)
def RawValue(typecode_or_type, *args):
'''
diff -r 04ff1cc40d62 Lib/multiprocessing/pool.py
--- a/Lib/multiprocessing/pool.py Fri Oct 04 11:38:59 2013 -0400
+++ b/Lib/multiprocessing/pool.py Sat Oct 05 20:27:46 2013 +0300
@@ -140,9 +140,9 @@
Process = Process
def __init__(self, processes=None, initializer=None, initargs=(),
- maxtasksperchild=None):
+ maxtasksperchild=None, maxqueuesize=0):
self._setup_queues()
- self._taskqueue = queue.Queue()
+ self._taskqueue = queue.Queue(maxqueuesize)
self._cache = {}
self._state = RUN
self._maxtasksperchild = maxtasksperchild
@@ -736,8 +736,8 @@
from .dummy import Process
return Process(*args, **kwds)
- def __init__(self, processes=None, initializer=None, initargs=()):
- Pool.__init__(self, processes, initializer, initargs)
+ def __init__(self, processes=None, initializer=None, initargs=(), maxqueuesize=0):
+ Pool.__init__(self, processes, initializer, initargs, maxqueuesize=maxqueuesize)
def _setup_queues(self):
self._inqueue = queue.Queue()
diff -r 04ff1cc40d62 Lib/test/_test_multiprocessing.py
--- a/Lib/test/_test_multiprocessing.py Fri Oct 04 11:38:59 2013 -0400
+++ b/Lib/test/_test_multiprocessing.py Sat Oct 05 20:27:46 2013 +0300
@@ -1729,6 +1729,13 @@
p.close()
p.join()
+ def test_make_pool_maxqueue_size(self):
+ print(sys.path)
+ p = multiprocessing.Pool(maxqueuesize=10)
+ self.assertEqual(10, p._taskqueue.maxsize)
+ p.close()
+ p.join()
+
def test_terminate(self):
result = self.pool.map_async(
time.sleep, [0.1 for i in range(10000)], chunksize=1