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:32:39 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[, maxqueuesize]]]]]) 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 + *maxqueuesize* 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:32:39 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:32:39 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:32:39 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