无法将项附加到多处理共享lis

2024-06-12 01:55:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用多处理为我的应用程序创建子进程。 我还在进程和子进程之间共享一个字典。在

我的代码示例:

主要工艺:

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': []}

有什么问题吗? 谢谢


Tags: 代码fromimport应用程序示例target字典进程
1条回答
网友
1楼 · 发布于 2024-06-12 01:55:49

Manager.dict将为您提供一个dict,其中直接更改将在进程之间传播,但它不会检测您是否更改了dict中包含的对象(如存储在"list_item"下的列表)。请参见SyncManager documentation底部的注释:

Note: Modifications to mutable values or items in dict and list proxies will not be propagated through the manager, because the proxy has no way of knowing when its values or items are modified. To modify such an item, you can re-assign the modified object to the container proxy.

因此,在您的示例中,当您在dict中设置列表时,该列表将同步,但是追加操作不会触发另一个同步。在

您可以通过重新分配dict中的键来解决这个问题:

from multiprocessing import Process, Manager

def mysubprocess(shared_dict):
    item = shared_dict['list_item'] = list()
    item.append('test')
    shared_dict['list_item'] = item
    print 'subprocess:', shared_dict

manager = Manager()
shared_dict = manager.dict()
p = Process(target=mysubprocess, args=(shared_dict,))
p.start()
p.join()
print 'main process:', shared_dict

但是,如果列表变长,这可能会变得低效——整个列表将被序列化,并在每次追加时发送给管理器进程。在这种情况下,一个更好的方法是直接使用SyncManager.list创建共享列表(尽管如果列表的元素是可变的,您仍然会遇到相同的问题—您需要在列表中重置它们,以便在进程之间发送它们)。在

相关问题 更多 >