代码之家  ›  专栏  ›  技术社区  ›  Ram Rachum

python多处理:向进程发送数据

  •  2
  • Ram Rachum  · 技术社区  · 15 年前

    我有子类 Process 像这样:

    class EdgeRenderer(Process):
        def __init__(self,starter,*args,**kwargs):
            Process.__init__(self,*args,**kwargs)
            self.starter=starter
    

    然后我定义了一个 run 使用的方法 self.starter .

    starter 对象属于类 State 这就是我的定义。

    我可以这样做吗?物体怎么了?它被序列化了吗?这是否意味着我必须确保 状态 对象是否可序列化?新进程是否获取此对象的副本?

    1 回复  |  直到 15 年前
        1
  •  8
  •   jnoller    15 年前

    在UNIX系统上,多处理使用os.fork()创建子进程,在Windows上,它使用一些子进程欺骗和序列化来共享数据。所以要跨平台,是的-它必须是可序列化的。孩子将得到一份新的拷贝。

    也就是说,这里有一个例子:

    from multiprocessing import Process
    import time
    
    class Starter(object):
        def __init__(self):
            self.state = False
    
    x = Starter()
    
    class EdgeRenderer(Process):
        def __init__(self,starter,*args,**kwargs):
            Process.__init__(self,*args,**kwargs)
            self.starter=starter
        def run(self):
            self.starter.state = "HAM SANDWICH"
            time.sleep(1)
            print self.starter.state
    
    a = EdgeRenderer(x)
    a.start()
    x.state = True
    a.join()
    print x.state
    

    运行时,您将看到:

    HAM SANDWICH
    True
    

    因此,父级所做的更改在fork()之后不会得到通信,子级所做的更改也有相同的问题。你必须遵守叉子的限制。