当前位置: 首页 > 面试题库 >

在不同进程之间共享列表?

单于帅
2023-03-14
问题内容

我有以下问题。我编写了一个函数,该函数将列表作为输入并为列表中的每个元素创建一个字典。然后,我想将此字典追加到新列表中,以便获得字典列表。我正在尝试为此生成多个进程。我在这里的问题是,我希望不同的进程访问字典列表,因为它由其他进程更新,例如,一旦达到一定长度,就打印一些东西。

我的例子是这样的:

import multiprocessing

list=['A', 'B', 'C', 'D', 'E', 'F']

def do_stuff(element):
    element_dict={}
    element_dict['name']=element
    new_list=[]
    new_list.append(element_dict)
    if len(new_list)>3:
        print 'list > 3'

###Main###
pool=multiprocessing.Pool(processes=6)
pool.map(do_stuff, list)
pool.close()

现在我的问题是每个过程都创建自己的过程new_list。有没有一种方法可以在进程之间共享列表,以便所有字典都附加到同一列表中?还是定义new_list函数外部的唯一方法?


问题答案:

一种方法是使用管理器对象并从中创建共享列表对象:

from multiprocessing import Manager, Pool

input_list = ['A', 'B', 'C', 'D', 'E', 'F']

manager = Manager()
shared_list = manager.list()

def do_stuff(element):
    global shared_list
    element_dict = {}
    element_dict['name'] = element
    shared_list.append(element_dict)
    if len(shared_list) > 3:
        print('list > 3')

pool = Pool(processes=6)
pool.map(do_stuff, input_list)
pool.close()

请记住,与线程不同,进程不共享内存空间。(产生时,每个进程都会获得其产生的内存足迹的副本,然后与之一起运行。)因此,它们只能通过某种形式的IPC进行通信(进程间通信)。在Python中,一种这样的方法是multiprocessing.Manager及其公开的数据结构,例如listdict。它们在代码中的用法与它们的内置等效项一样容易,但是在后台使用了某种形式的IPC(可能是套接字)。



 类似资料:
  • 问题内容: 我正在尝试使用部分函数,​​以便pool.map()可以定位具有多个参数(在本例中为Lock()对象)的函数。 这是示例代码(摘自我之前的问题的答案): 但是,当我运行此代码时,出现错误: 我在这里想念什么?如何在子流程之间共享锁? 问题答案: 您不能将普通对象传递给方法,因为它们不能被腌制。有两种方法可以解决此问题。一种是创建并传递一个: 不过,这有点重量级;使用需要产生另一个进程来

  • 问题内容: 该模块的文档显示了如何将队列传递给以开头的进程。但是,如何与开始的异步工作进程共享队列?我不需要动态加入或其他任何方式,而只是工人(反复)将其结果报告给基地的一种方法。 失败的原因是: 。我理解这意味着什么,并且我理解继承的建议,而不是要求进行酸洗/酸洗(以及所有Windows特殊限制)。但如何 做 我通过队列的方式,作品?我找不到一个示例,并且我尝试了多种失败的替代方法。请帮忙? 问

  • 问题内容: 通过回答此问题,可以回答所有其他三个问题。希望我能说清楚: 在通过多处理创建的某些过程中创建对象后: 如何将对该对象的 引用 传递给其他进程? (不是很重要)我如何确保持有参考书时此过程不会消失? 示例1(已解决) 例子2 假设返回一个具有可变状态的对象。这个相同的对象应该可以从其他进程访问。 例子3 我有一个带有打开文件和锁的对象-如何授予对其他进程的访问权限? 提醒 我不希望此特定

  • 问题内容: 我想像这样在多个线程之间共享一个变量: 我想在主线程和帮助线程之间共享,这是我创建的两个不同的Java类。有什么办法吗?谢谢! 问题答案: 二者并可以参照包含该变量的类。 然后,可以使该变量为 volatile ,这意味着 对该变量的更改在两个线程中立即可见。 有关更多信息,请参见本文。 易变变量 共享已同步的可见性功能,但不共享原子性功能。这意味着线程将自动 查看volatile变量

  • 问题内容: 我知道如何将其用于创建共享对象,尤其是可以在工作人员之间共享的队列。有这个问题,这个问题,[这个问题](http://codingdict.com/questions/1299甚至是我自己的一个问题。 但是,我需要定义很多队列,每个队列都链接一对特定的进程。假设每对进程及其链接队列均由变量标识。 当我需要放置和获取数据时,我想使用字典来访问我的队列。我无法完成这项工作。我已经尝试了很多

  • 问题内容: 我有简单的 UDPServer ,它可以与 多处理一起使用 。 我想创建一个列表,其中包含有关所有客户端的信息。 我使用 Manager ,但是我不明白如何在列表中附加信息-我需要传输Manager的对象来处理,但是如何呢?我的新属性方式不起作用。 如何解决?谢谢! 输出: 问题答案: 问题是您要在启动工作进程后立即让主进程完成其执行。当创建过程完成执行后,服务器将关闭,这意味着您的共