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

前端之家收集整理的这篇文章主要介绍了python – 多进程在进程之间共享不可序列化的对象前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有三个问题可能重复(但太具体):

> How to properly set up multiprocessing proxy objects for objects that already exist
> Share object with process (multiprocess)
> Can I use a ProcessPoolExecutor from within a Future?

通过回答这个问题,可以回答其他三个问题.
希望我明确表示:

一旦在多处理创建的某个进程中创建了一个对象:

>如何将对该对象的引用传递给另一个进程?
>(不是那么重要)当我持有参考文件时,如何确保这个过程不会死机?

示例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

我有一个对象有一个打开的文件和一个锁 – 我如何授予访问其他进程?

提醒

我不希望这个具体错误不出现.或者解决这个具体的用途.该解决方案应该足够普遍,以便在进程之间共享不可移动的对象.可以在任何进程中创建对象.使所有对象可移动并保留身份的解决方案也可以很好.

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

这是尝试解决这个问题,但没有多重处理:https://github.com/niccokunzmann/pynet/blob/master/documentation/done/tools.rst

问题

What you want the other processes to do with the references?

引用可以传递给使用多重处理创建的任何其他进程(重复3).可以访问属性,调用引用.访问的attibutes可能是也可能不是代理.

What’s the problem with just using a proxy?

也许没有问题,但也是一个挑战.我的印象是,一个代理有一个经理,一个经理有自己的进程,所以不可序列化的对象必须被序列化和转移(部分用StacklessPython / fork解决).
还存在特殊对象的代理 – 为所有对象(可解决)构建代理是很难但并非不可能的.

解? – 代理经理?

Eric Urban表示序列化不是问题.真正的挑战在Example2& 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.

然后,您在该管理器上注册您的课程,如下所示:

MyManager.register("MySharedClass",MySharedClass)

然后,一旦管理器被启动并启动,使用manager.start(),您可以使用manager.MySharedClass创建类的共享实例.这应该适用于所有需要.返回的代理与原始对象完全相同,除了documentation中描述的一些例外.

原文链接:https://www.f2er.com/python/186198.html

猜你在找的Python相关文章