我有一个复杂的数据结构(用户定义的类型),在它上面执行了大量的独立计算。数据结构基本上是不可变的。我说的基本是,因为虽然接口看起来是不可变的,但内部正在进行一些惰性求值。一些延迟计算的属性存储在字典中(通过输入参数返回代价函数的值)。我想使用 Python 的多处理模块来并行化这些计算。我有两个问题。
- 我如何最好地在进程之间共享数据结构?
- 有没有办法在不使用锁的情况下处理惰性求值问题(多个进程写入相同的值)?
提前感谢您的任何答案、评论或启发性问题!
我有一个复杂的数据结构(用户定义的类型),在它上面执行了大量的独立计算。数据结构基本上是不可变的。我说的基本是,因为虽然接口看起来是不可变的,但内部正在进行一些惰性求值。一些延迟计算的属性存储在字典中(通过输入参数返回代价函数的值)。我想使用 Python 的多处理模块来并行化这些计算。我有两个问题。
提前感谢您的任何答案、评论或启发性问题!
我如何最好地在进程之间共享数据结构?
管道。
origin.py | process1.py | process2.py | process3.py
分解您的程序,以便每个计算都是以下形式的单独过程。
def transform1( piece ):
Some transformation or calculation.
对于测试,您可以像这样使用它。
def t1( iterable ):
for piece in iterable:
more_data = transform1( piece )
yield NewNamedTuple( piece, more_data )
为了在单个过程中重现整个计算,您可以这样做。
for x in t1( t2( t3( the_whole_structure ) ) ):
print( x )
您可以使用一点文件 I/O 来包装每个转换。Pickle 可以很好地解决这个问题,但其他表示(如 JSON 或 YAML)也可以很好地工作。
while True:
a_piece = pickle.load(sys.stdin)
more_data = transform1( a_piece )
pickle.dump( NewNamedTuple( piece, more_data ) )
每个处理步骤都成为一个独立的操作系统级进程。它们将同时运行,并且会立即消耗所有操作系统级别的资源。
有没有办法在不使用锁的情况下处理惰性求值问题(多个进程写入相同的值)?
管道。