多处理过程中的共享状态

时间:2015-05-15 16:44:39

标签: python multiprocessing

请考虑以下代码:

import time
from multiprocessing import Process

class Host(object):
    def __init__(self):
        self.id = None
    def callback(self):
        print "self.id = %s" % self.id
    def bind(self, event_source):
        event_source.callback = self.callback

class Event(object):
    def __init__(self):
        self.callback = None
    def trigger(self):
        self.callback()

h = Host()
h.id = "A"
e = Event()
h.bind(e)
e.trigger()

def delayed_trigger(f, delay):
    time.sleep(delay)
    f()

p = Process(target = delayed_trigger, args = (e.trigger, 3,))
p.start()

h.id = "B"
e.trigger()

这给出了输出

self.id = A
self.id = B
self.id = A

但是,我希望它能给出

self.id = A
self.id = B
self.id = B

..因为h.id已经改为" B"到触发方法被调用时。

似乎在单独的Process启动时创建了主机实例的副本,因此原始主机中的更改不会影响该副本。

在我的项目中(当然更详细),主机实例字段会不时更改,并且由在单独进程中运行的代码触发的事件可以访问这些更改。

1 个答案:

答案 0 :(得分:4)

multiprocessing在单独的进程中运行。由于在进程之间共享内容需要共享内存或通信,因此在发送时复制的内容几乎是不可思议的。

事实上,如果您仔细阅读该模块,您可以看到在分歧之后实际分享流程之间所需的工作量,通过explicit communicationexplicitly-shared objects(这些是该语言的一个非常有限的子集,必须由Manager)管理。