10.4.16 共享命名空间
除了字典和列表,Manager还可以创建一个共享Namespace。
import multiprocessing
def producer(ns,event):
ns.value = 'This is the value'
event.set()
def consumer(ns,event):
try:
print('Before event:{}'.format(ns.value))
except Exception as err:
print('Before event,error:',str(err))
event.wait()
print('After event:',ns.value)
if __name__ == '__main__':
mgr = multiprocessing.Manager()
namespace = mgr.Namespace()
event = multiprocessing.Event()
p = multiprocessing.Process(
target=producer,
args=(namespace,event),
)
c = multiprocessing.Process(
target=consumer,
args=(namespace,event),
)
c.start()
p.start()
c.join()
p.join()
增加到Namespace的所有命名值对所有接收Namespace实例的客户都可见。
运行结果:
对命名空间中可变值内容的更新不会自动传播,如下面的例子所示。
import multiprocessing
def producer(ns,event):
# DOES NOT UPDATE GLOBAL VALUE!
ns.my_list.append('This is the value')
event.set()
def consumer(ns,event):
print('Before event:',ns.my_list)
event.wait()
print('After event :',ns.my_list)
if __name__ == '__main__':
mgr = multiprocessing.Manager()
namespace = mgr.Namespace()
namespace.my_list = []
event = multiprocessing.Event()
p = multiprocessing.Process(
target=producer,
args=(namespace,event),
)
c = multiprocessing.Process(
target=consumer,
args=(namespace,event),
)
c.start()
p.start()
c.join()
p.join()
要更新这个列表,需要将它再次关联到命名空间对象。
运行结果: