我已经将Process
分类为:
class EdgeRenderer(Process):
def __init__(self,starter,*args,**kwargs):
Process.__init__(self,*args,**kwargs)
self.starter=starter
然后我定义了一个使用run
的{{1}}方法。
self.starter
对象是我定义的类starter
。
我可以这样做吗?对象会发生什么?它是否被序列化?这是否意味着我总是必须确保State
对象是可序列化的?新进程是否获得此对象的副本?
答案 0 :(得分: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
因此,在fork()之后,父进行的更改不会得到通信,并且子进程所做的更改会产生相同的问题。你必须遵守fork限制。