代码之家  ›  专栏  ›  技术社区  ›  Björn Pollex

在python中共享进程间的数据

  •  6
  • Björn Pollex  · 技术社区  · 15 年前

    我有一个复杂的数据结构(用户定义的类型),在这个结构上执行大量的独立计算。数据结构基本上是不可变的。我说,基本上,因为尽管接口看起来是不可变的,但内部仍在进行一些懒惰的评估。一些延迟计算的属性存储在字典中(按输入参数返回代价高昂的函数的值)。 我想用蟒蛇 multiprocessing 模块来并行这些计算。我心里有两个问题。

    1. 如何在进程之间最好地共享数据结构?
    2. 是否有一种方法可以在不使用锁的情况下处理延迟评估问题(多个进程写入相同的值)?

    提前感谢您的回答、评论或启发性问题!

    1 回复  |  直到 15 年前
        1
  •  8
  •   S.Lott    15 年前

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

    管道。

    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 ) )
    

    每个处理步骤都成为独立的操作系统级进程。它们将并发运行,并将——立即——消耗所有操作系统级的资源。

    是否有一种方法可以在不使用锁的情况下处理延迟评估问题(多个进程写入相同的值)?

    管道。