python - 多处理进程中的共享状态

标签 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”。

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

在我的项目中(当然更复杂),主机实例字段会不时更改,并且由在单独进程中运行的代码触发的事件能够访问这些更改非常重要。

最佳答案

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

事实上,如果您仔细阅读该模块,您可以看到在分歧之后在进程之间实际共享任何内容所需的工作量,或者通过 explicit communication ,或通过explicitly-shared objects (它们属于语言的非常有限的子集,并且必须由 Manager 管理)。

关于python - 多处理进程中的共享状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30264699/

相关文章:

python - 如何匹配句子中的字符串

python - 关于注册表中不存在的连接名称的 CQL 引擎异常

python - 将实时数据发送到 Django 前端

python - 多处理和队列

python - Python 中具有多个参数的方法的多重处理

c++ - 在 Qt 中检测进程已完成

Python - 在这种情况下如何解释将数据分配给数组

python - urllib 下载在线目录的内容

python - 多处理嵌套Python循环

python - 如何在 python 多处理中知道进程何时结束