2

我有这样的子Process类:

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

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

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

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

4

1 回答 1

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() 之后,父母所做的更改不会得到传达,而孩子所做的更改也有同样的问题。你必须遵守分叉限制。

于 2009-04-23T13:37:03.940 回答