multiprocessing: map vs map_async
There are four choices to mapping jobs to processes. You have to consider multi-args, concurrency, blocking, and ordering. map
and map_async
only differ with respect to blocking. map_async
is non-blocking where as map
is blocking
So let's say you had a function
from multiprocessing import Pool
import time
def f(x):
print x*x
if __name__ == '__main__':
pool = Pool(processes=4)
pool.map(f, range(10))
r = pool.map_async(f, range(10))
# DO STUFF
print 'HERE'
print 'MORE'
r.wait()
print 'DONE'
Example output:
0
1
9
4
16
25
36
49
64
81
0
HERE
1
4
MORE
16
25
36
9
49
64
81
DONE
pool.map(f, range(10))
will wait for all 10 of those function calls to finish so we see all the prints in a row.
r = pool.map_async(f, range(10))
will execute them asynchronously and only block when r.wait()
is called so we see HERE
and MORE
in between but DONE
will always be at the end.
Comments
-
aman over 4 years
What's the difference between using
map
andmap_async
? Are they not running the same function after distributing the items from the list to 4 processes?So is it wrong to presume both are running asynchronous and parallel?
def f(x): return 2*x p=Pool(4) l=[1,2,3,4] out1=p.map(f,l) #vs out2=p.map_async(f,l)
-
aman about 8 yearsok so if i dont have other tasks to do beside executing the function f over the list, then map and map_async are same
-
quikst3r about 8 yearsNot quite. You'll notice map will execute in order, but map_async doesn't
-
HBeel over 7 yearsShould there be a
print 'DONE'
afterr.wait()
? -
quikst3r over 7 yearsYes there should be!
-
webelo over 6 yearsIf above example doesn't return different results for
map
andmap_async
on first run, try settingrange(500)
or something large. -
Jirka over 5 years
-
ScipioAfricanus about 5 yearsHello, will this work with this solution: stackoverflow.com/questions/5442910/… ? I am attempting to pass multiple args to the function.
-
Catbuilts almost 5 years@quikst3r: For me they both execute in random order. I change func f() to print(x), and the parameters: "pool.map(f, range(11,20)); r = pool.map_async(f, range(10))"; After run the code, it return: "11 12 13 15 16 17 18 14 19 HERE 0 MORE 2 1 3 4 5 6 7 8 9 DONE"
-
v.tralala over 4 yearsIf you don't see HERE and MORE and random positions you don't need to set range to a very high number and then keep scrolling for the prints. For me it was enough to set a
time.sleep(0.0002)
right before the print part And increase range a little bit to 100 -
dano about 3 years@Catbuilts Yeah, there is no difference in ordering between
map_async
andmap
, @quikst3r was mistaken when he said that.map
is actually implemented internally asmap_async(...).get()
.