Consider:
from multiprocessing import Queue
from multiprocessing.managers import SyncManager
def make_manager(q_names, port):
qs = [Queue() for _ in q_names]
class MyManager(SyncManager):
pass
for q_name, q in zip(q_names, qs):
MyManager.register(q_name, callable=lambda: q)
auth = b'myauth'
try:
manager = MyManager(address=('', port), authkey=auth)
manager.start()
except:
print('Could not start manager')
return manager
manager = make_manager(['aa', 'bb'], 8000)
print(manager.aa())
print(manager.bb())
The output is:
<multiprocessing.queues.Queue object at 0x7f7ed1c83eb0>
<multiprocessing.queues.Queue object at 0x7f7ed1c83eb0>
Why do both methods return the same queue?
UPDATE:
I figured out that the issue is about how lambda captures. Here is an example to illustrate:
ll = []
for i in range(2):
ll.append(lambda: i)
for l in ll:
print(l()) # 1
I am still not sure how to get around this, but will search again as it's not related to multiprocessing.
UPDATE: Found it: Lambda in a loop