【问题标题】:Shared state in multiprocessing Processes多处理进程中的共享状态
【发布时间】:2015-05-15 16:44:39
【问题描述】:

请考虑以下代码:

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

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

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

【问题讨论】:

  • def __init(self):?最后是不是错过了__
  • 你是对的:多处理在单独的线程中运行这些线程,每个线程都有自己的 Host 类实例,它们之间不通信。你应该看看这个答案:stackoverflow.com/questions/16244745/…
  • 多处理不共享内存......它实际上是 2 个完全独立的程序。使用multiprocessing.Pipe在进程之间进行通信,或者如果您需要共享内存空间,则使用线程(有一种方法可以与多处理iirc共享内存......但这会使一切变得缓慢......令人难以忍受)
  • @theodox - 每个线程都有自己的 Host 类实例 - 你混淆了 threadsprocesses线程共享内存,进程不共享。
  • 对我来说是真实的、草率的词汇。主要的一点是它们分开的主机是隔离运行的。

标签: python multiprocessing


【解决方案1】:

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

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

【讨论】:

  • 谢谢,我已经设法找到一种方法来在单独的线程而不是进程中运行这些事件源。如果我不能这样做,也许我可以使用 Redis 来获取数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-30
  • 2021-09-23
相关资源
最近更新 更多