三个问题可能重复(但过于具体):
通过回答这个问题,可以回答所有其他三个问题。希望我说清楚:
一旦我在由多处理创建的某个进程中创建了一个对象:
- 如何将该对象的引用传递给其他进程?
- (不那么重要)我如何确保在我持有参考时这个过程不会死掉?
示例 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.不可序列化对象必须在manager进程中创建。