Issue #18620: Improve Pool examples in multiprocessing documentation

A single call to Pool.apply_async() will create only one process. To use all
of the pool's processes, it should be invoked multiple times:

    with Pool(processes=4) as pool:
        results = [pool.apply_async(func, ()) for i in range(4)]

Patch by Davin Potts.
This commit is contained in:
Berker Peksag 2016-01-22 00:00:06 +02:00
commit 2e15d60b83
1 changed files with 26 additions and 11 deletions

View File

@ -361,8 +361,9 @@ processes in a few different ways.
For example:: For example::
from multiprocessing import Pool from multiprocessing import Pool, TimeoutError
from time import sleep import time
import os
def f(x): def f(x):
return x*x return x*x
@ -378,15 +379,29 @@ For example::
for i in pool.imap_unordered(f, range(10)): for i in pool.imap_unordered(f, range(10)):
print(i) print(i)
# evaluate "f(10)" asynchronously # evaluate "f(20)" asynchronously
res = pool.apply_async(f, [10]) res = pool.apply_async(f, (20,)) # runs in *only* one process
print(res.get(timeout=1)) # prints "100" print(res.get(timeout=1)) # prints "400"
# make worker sleep for 10 secs # evaluate "os.getpid()" asynchronously
res = pool.apply_async(sleep, [10]) res = pool.apply_async(os.getpid, ()) # runs in *only* one process
print(res.get(timeout=1)) # raises multiprocessing.TimeoutError print(res.get(timeout=1)) # prints the PID of that process
# launching multiple evaluations asynchronously *may* use more processes
multiple_results = [pool.apply_async(os.getpid, ()) for i in range(4)]
print([res.get(timeout=1) for res in multiple_results])
# make a single worker sleep for 10 secs
res = pool.apply_async(time.sleep, (10,))
try:
print(res.get(timeout=1))
except TimeoutError:
print("We lacked patience and got a multiprocessing.TimeoutError")
print("For the moment, the pool remains available for more work")
# exiting the 'with'-block has stopped the pool # exiting the 'with'-block has stopped the pool
print("Now the pool is closed and no longer available")
Note that the methods of a pool should only ever be used by the Note that the methods of a pool should only ever be used by the
process which created it. process which created it.
@ -2176,13 +2191,14 @@ with the :class:`Pool` class.
The following example demonstrates the use of a pool:: The following example demonstrates the use of a pool::
from multiprocessing import Pool from multiprocessing import Pool
import time
def f(x): def f(x):
return x*x return x*x
if __name__ == '__main__': if __name__ == '__main__':
with Pool(processes=4) as pool: # start 4 worker processes with Pool(processes=4) as pool: # start 4 worker processes
result = pool.apply_async(f, (10,)) # evaluate "f(10)" asynchronously result = pool.apply_async(f, (10,)) # evaluate "f(10)" asynchronously in a single process
print(result.get(timeout=1)) # prints "100" unless your computer is *very* slow print(result.get(timeout=1)) # prints "100" unless your computer is *very* slow
print(pool.map(f, range(10))) # prints "[0, 1, 4,..., 81]" print(pool.map(f, range(10))) # prints "[0, 1, 4,..., 81]"
@ -2192,9 +2208,8 @@ The following example demonstrates the use of a pool::
print(next(it)) # prints "1" print(next(it)) # prints "1"
print(it.next(timeout=1)) # prints "4" unless your computer is *very* slow print(it.next(timeout=1)) # prints "4" unless your computer is *very* slow
import time
result = pool.apply_async(time.sleep, (10,)) result = pool.apply_async(time.sleep, (10,))
print(result.get(timeout=1)) # raises TimeoutError print(result.get(timeout=1)) # raises multiprocessing.TimeoutError
.. _multiprocessing-listeners-clients: .. _multiprocessing-listeners-clients: