A program that creates several processes that work on a join-able queue, Q
, and may eventually manipulate a global dictionary D
to store results. (so each child process may use D
to store its result and also see what results the other child processes are producing)
If I print the dictionary D in a child process, I see the modifications that have been done on it (i.e. on D). But after the main process joins Q, if I print D, it's an empty dict!
I understand it is a synchronization/lock issue. Can someone tell me what is happening here, and how I can synchronize access to D?
A general answer involves using a Manager
object. Adapted from the docs:
from multiprocessing import Process, Manager
def f(d):
d[1] += '1'
d['2'] += 2
if __name__ == '__main__':
manager = Manager()
d = manager.dict()
d[1] = '1'
d['2'] = 2
p1 = Process(target=f, args=(d,))
p2 = Process(target=f, args=(d,))
p1.start()
p2.start()
p1.join()
p2.join()
print d
Output:
$ python mul.py
{1: '111', '2': 6}