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