我正在使用多处理为我的应用程序创建子进程。 我还在进程和子进程之间共享一个字典。在
我的代码示例:
主要工艺:
from multiprocessing import Process, Manager
manager = Manager()
shared_dict = manager.dict()
p = Process(target=mysubprocess, args=(shared_dict,))
p.start()
p.join()
print shared_dict
我的子流程:
^{pr2}$在这两种情况下,印刷值为:
{'list_item': []}
有什么问题吗? 谢谢
Manager.dict
将为您提供一个dict,其中直接更改将在进程之间传播,但它不会检测您是否更改了dict中包含的对象(如存储在"list_item"
下的列表)。请参见SyncManager documentation底部的注释:因此,在您的示例中,当您在dict中设置列表时,该列表将同步,但是追加操作不会触发另一个同步。在
您可以通过重新分配dict中的键来解决这个问题:
但是,如果列表变长,这可能会变得低效——整个列表将被序列化,并在每次追加时发送给管理器进程。在这种情况下,一个更好的方法是直接使用
SyncManager.list
创建共享列表(尽管如果列表的元素是可变的,您仍然会遇到相同的问题—您需要在列表中重置它们,以便在进程之间发送它们)。在相关问题 更多 >
编程相关推荐