【发布时间】:2014-03-24 23:10:26
【问题描述】:
三个问题可能重复(但过于具体):
- 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
问题
您希望其他进程如何处理引用?
引用可以传递给使用多处理创建的任何其他进程(重复 3)。可以访问属性,调用引用。访问的属性可能是也可能不是代理。
只使用代理有什么问题?
也许没有问题,只有挑战。我的印象是代理有一个管理器,并且一个管理器有自己的进程,因此不可序列化的对象必须被序列化和传输(使用 StacklessPython/fork 部分解决)。 还存在特殊对象的代理 - 为所有对象构建代理很难但并非不可能(可解决)。
解决方案? - 代理 + 经理?
Eric Urban 表明序列化不是问题。真正的挑战在于示例 2 和 3:状态的同步。我对解决方案的想法是为经理创建一个特殊的代理类。这个代理类
- 采用不可序列化对象的构造函数
- 获取一个可序列化的对象并将其传输到管理器进程。
- (问题)根据1.不可序列化对象必须在管理器进程中创建。
【问题讨论】:
-
应该编辑问题以解释您希望其他进程对引用执行什么操作。只将它们传回原始流程?
-
已编辑。如果这不能回答问题,请告诉我,谢谢。
-
只使用代理有什么问题?
-
我编辑了这个问题。谢谢你的回答,很有见地。
-
所以我想在上一篇文章中说的是,我没有看到任何例子表明将对象转移到管理器而不是首先在那里创建它真的更好。
标签: python python-3.x proxy multiprocessing concurrent.futures