python – 多进程在进程之间共享不可序列化的对象
有三个问题可能重复(但太具体):
> How to properly set up multiprocessing proxy objects for objects that already exist 通过回答这个问题,可以回答其他三个问题. 一旦在多处理创建的某个进程中创建了一个对象: >如何将对该对象的引用传递给另一个进程? 示例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 问题
引用可以传递给使用多重处理创建的任何其他进程(重复3).可以访问属性,调用引用.访问的attibutes可能是也可能不是代理.
也许没有问题,但也是一个挑战.我的印象是,一个代理有一个经理,一个经理有自己的进程,所以不可序列化的对象必须被序列化和转移(部分用StacklessPython / fork解决). 解? – 代理经理? Eric Urban表示序列化不是问题.真正的挑战在Example2& 3:状态的同步.我的解决方案的想法是为经理创建一个特殊的代理类.这个代理类 >为不可序列化的对象创建一个构件 解决方法
大多数情况下,将现有对象的引用传递给另一个进程并不是真正需要的.相反,您创建要在进程之间共享的类:
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中描述的一些例外. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |