之间的对象有三个问题作为可能的重复(但太具体):多重分享不可序列化进程
- 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表明序列化不是问题。真正的挑战在于Example 3 & 3:状态的同步。我对解决方案的想法是为经理创建一个特殊的代理类。该代理类
- 花费不可序列化对象constuctor
- 将可序列化对象,并将其传输到管理器进程。
- (问题)根据1.必须在管理器进程中创建不可序列化的对象。
应编辑该问题以解释您希望其他过程如何处理参考。只有将它们传回原始过程? –
编辑它。告诉我,如果这不能回答这个问题,谢谢。 – User
只使用代理有什么问题? – Kritzefitz