在Python中进程间共享数据

7 投票
1 回答
2370 浏览
提问于 2025-04-16 02:34

我有一个复杂的数据结构(用户自定义类型),在这个数据结构上会进行很多独立的计算。这个数据结构基本上是不可变的。我说“基本上”,是因为虽然它的外部接口看起来是不可变的,但内部其实有一些延迟计算的过程。有些延迟计算的属性是存储在字典里的(这些字典的值是通过输入参数调用一些耗时函数得到的)。

我想使用Python的multiprocessing模块来让这些计算并行进行。现在我有两个问题。

  1. 我该如何在不同的进程之间共享这个数据结构呢?
  2. 有没有办法处理延迟计算的问题,而不使用锁(因为多个进程可能会写入相同的值)?

谢谢大家提前提供的任何答案、评论或启发性的问题!

1 个回答

8

我该如何在进程之间最好地共享数据结构?

可以使用管道。

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 )

你可以在每个转换步骤中加一点文件输入输出。使用Pickle效果不错,但其他格式(比如JSON或YAML)也很好用。

while True:
    a_piece = pickle.load(sys.stdin)
    more_data = transform1( a_piece )
    pickle.dump( NewNamedTuple( piece, more_data ) )

每个处理步骤变成一个独立的操作系统级别的进程。它们会同时运行,并且会立即消耗所有操作系统资源。

有没有办法在不使用锁的情况下处理懒惰求值的问题(多个进程写入相同的值)?

同样可以使用管道。

撰写回答