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

多进程共享进程之间的不可序列化对象

百里沛
2023-03-14
问题内容

通过回答此问题,可以回答所有其他三个问题。希望我能说清楚:

在通过多处理创建的某些过程中创建对象后:

  1. 如何将对该对象的 引用 传递给其他进程?
  2. (不是很重要)我如何确保持有参考书时此过程不会消失?

示例1(已解决)

from concurrent.futures import *

def f(v):
    return lambda: v * v

if __name__ == '__main__':
    with ThreadPoolExecutor(1) as e: # works with ThreadPoolExecutor
        l = list(e.map(f, [1,2,3,4]))
    print([g() for g in l]) # [1, 4, 9, 16]

例子2

假设f返回一个具有可变状态的对象。这个相同的对象应该可以从其他进程访问。

例子3

我有一个带有打开文件和锁的html" target="_blank">对象-如何授予对其他进程的访问权限?

提醒

我不希望此特定错误不会出现。或针对此特定用例的解决方案。解决方案应该足够通用,以仅在进程之间共享不可移动的对象。可以在任何过程中创建对象。使所有对象都可移动并保留身份的解决方案也可能很好。

任何提示都是值得欢迎的,任何指向如何实现解决方案的部分解决方案或代码片段都是值得的。因此,我们可以一起创建解决方案。

这是 尝试 解决此问题但不进行多重处理的 尝试
:https
:
//github.com/niccokunzmann/pynet/blob/master/documentation/done/tools.rst

问题

您希望其他过程如何处理引用?

可以将引用传递给使用multiprocessing创建的任何其他进程(重复3)。一个可以访问属性的调用引用。访问的服装可能是也可能不是代理。

仅使用代理有什么问题?

也许没有问题,只是挑战。我的印象是,代理具有管理器,并且管理器具有其自己的进程,因此必须对无法序列化的对象进行序列化和转移(使用StacklessPython
/ fork部分解决)。也存在特殊对象的代理-很难但并非不可能为所有对象构建代理(可解决)。

解? -代理人+经理?

Eric Urban显示序列化不是问题。真正的挑战在于Example2&3:状态的同步。我对解决方案的想法是为经理创建一个特殊的代理类。该代理类

  1. 对非序列化对象采用构造方法
  2. 接受一个可序列化的对象,并将其转移到管理器进程。
  3. (问题)根据1.必须在管理器进程中创建不可序列化的对象。

问题答案:

在大多数情况下,将现有对象的引用传递给另一个进程并不是很理想。相反,您可以创建要在流程之间共享的类:

class MySharedClass:
    # stuff...

然后,您将像这样创建一个代理管理器:

import multiprocessing.managers as m
class MyManager(m.BaseManager):
    pass # Pass is really enough. Nothing needs to be done here.

然后,您在该Manager上注册课程,如下所示:

MyManager.register("MySharedClass", MySharedClass)

然后,实例化了经理并启动了经理之后,manager.start()您就可以使用创建类的共享实例manager.MySharedClass。这应该适合所有需求。返回的代理的工作原理与原始对象完全相同,除了文档中描述的某些例外。



 类似资料:
  • 问题内容: 我有以下问题。我编写了一个函数,该函数将列表作为输入并为列表中的每个元素创建一个字典。然后,我想将此字典追加到新列表中,以便获得字典列表。我正在尝试为此生成多个进程。我在这里的问题是,我希望不同的进程访问字典列表,因为它由其他进程更新,例如,一旦达到一定长度,就打印一些东西。 我的例子是这样的: 现在我的问题是每个过程都创建自己的过程。有没有一种方法可以在进程之间共享列表,以便所有字典

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

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

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

  • 我想在多个python进程之间共享。以便从其他python进程发送。 如何跨多个python进程共享。 代码如下: 目标是从通道从其他python进程发送。