加入收藏 | 设为首页 | 会员中心 | 我要投稿 大庆站长网 (https://www.0459zz.com/)- 科技、智能边缘云、事件网格、云计算、站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2021-01-11 16:42:20 所属栏目: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

有三个问题可能重复(但太具体):

> 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中描述的一些例外.

(编辑:大庆站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读