2009-04-22 90 views
2

我已经子类Process像这样:Python的多处理:将数据发送到过程

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

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

starter对象是我定义的State类。

我可以这样做吗?对象发生了什么?它是否被序列化?这是否意味着我始终必须确保State对象是可序列化的?新进程是否获取此对象的重复副本?

回答

8

在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 

所以变化的父母创造叉后没有得到传达()和孩子所做的改变也有同样的问题。你必须遵守分叉限制。

+0

你是我的英雄:-p – fuzzyman 2009-04-23 13:44:50

相关问题