当前位置: 首页 > 面试题库 >

多处理流程中的共享状态

南宫云
2023-03-14
问题内容

请考虑以下代码:

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

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

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


问题答案:

多处理在不同的 流程中
运行东西。事物在发送时 不被 复制几乎是不可想象的,因为在进程之间共享内容需要共享内存或通信。

实际上,如果您仔细阅读该模块,则可以看到通过分叉通信或通过显式共享的对象(属于显式对象的非常有限的子集),在分歧之后的进程之间实际共享任何内容所需的工作量。html" target="_blank">语言,并且必须由Manager)管理。



 类似资料:
  • 问题内容: 我有三个大名单。前一个包含位数组(模块位数组0.8.0),另外两个包含整数数组。 这些数据结构占用相当多的RAM(总计约16GB)。 如果我使用以下方法启动12个子流程: 这是否意味着将为每个子流程复制l1,l2和l3,或者子流程将共享这些列表?或者更直接地说,我将使用16GB还是192GB的RAM? someFunction将从这些列表中读取一些值,然后根据读取的值执行一些计算。结果

  • 问题内容: 第一个问题是Value和Manager()。Value有什么区别? 其次,是否可以不使用Value共享整数变量?下面是我的示例代码。我想要的是获取一个整数值而不是Value的字典。我所做的就是在此过程之后全部更改。有没有更简单的方法? 问题答案: 使用时,您会在共享内存中获得一个对象,默认情况下,该对象使用进行同步。使用该对象时,您将得到一个控制服务器进程的对象,该服务器进程允许对象值

  • Apache Beam最近通过和注释引入了状态单元格,并在Apache Flink和Google Cloud Dataflow中提供了部分支持。

  • 问题内容: 一个程序,该程序创建在可连接队列上工作的多个进程,并且最终可能会操纵全局字典来存储结果。(因此,每个子进程都可以用来存储其结果,并查看其他子进程正在产生什么结果) 如果我在子进程中打印字典,则可以看到对它进行的修改(即在上)。但是在主流程加入之后,如果我打印D,那就是空洞的字典! 我了解这是同步/锁定问题。有人可以告诉我这里发生了什么,如何同步对的访问? 问题答案: 普遍的答案涉及使用

  • 问题内容: 我正在Python中进行多处理实验,并试图在两个进程之间共享一个字符串数组。这是我的python代码: 运行脚本时,我看到该脚本已正确填充,并且可在中找到,但不能在中找到。结果如下: 我忽略了什么吗? 预先感谢您的反馈。:) 问题答案: 我的猜测是: 存储3个指针。将它们分配给当前进程之外没有意义的内存地址。尝试访问此时包含垃圾邮件的无意义地址。 分配对所有过程都有意义的值似乎有帮助:

  • javadoc for意味着流管道中的“行为操作”通常必须是无状态的。然而,它所展示的如何不编写管道的示例似乎都涉及并行流。 这在多大程度上适用于顺序流? 我的问题是:我紧张是对的,还是上面的代码值得信任? 假设中的表达式使用了某种共享状态。当使用顺序流时,我们能相信它会正常工作吗?