【问题标题】:Python multiprocessing: Why don't objects instances have the same adress?Python多处理:为什么对象实例没有相同的地址?
【发布时间】:2016-11-21 12:40:00
【问题描述】:

我想知道为什么子进程会打印出不同的对象地址。我也试过找经理,但不影响结果。

import time
import multiprocessing as mp

class TestO:
    def __init__(self, a):
        self.a = a

    def get_name(self):
        return self.a



def run_task(tasks,nr):
    obj = tasks[nr]['data']
    print obj, obj.get_name()



if __name__ == "__main__":

    tasks = dict()

    a = TestO('first')
    b = TestO('second')

    tasks[1] = {'data': a}
    tasks[2] = {'data': b}


    process1 = mp.Process(target = run_task, name = 'process1', args = (tasks, 1))
    process2 = mp.Process(target = run_task, name = 'process2', args = (tasks, 2))

    process1.start()

    time.sleep(0.2)

    process2.start()

    process1.join()
    process2.join()


    print a, 'first'
    print b, 'second'

这将给出结果

<__main__.TestO instance at 0x02EFD2D8> first
<__main__.TestO instance at 0x0373D300> second
<__main__.TestO instance at 0x043663C8> first
<__main__.TestO instance at 0x043663F0> second

是否正在复制实例?有没有办法以某种方式保持相同的实例?我遇到了上述更复杂版本的问题,其中类对象更复杂。在这种情况下我得到的结果是我在对象实例上设置的值在它们输入mp.Process 后被取消,即obj.get_name 返回None

【问题讨论】:

    标签: python-2.7 python-multiprocessing


    【解决方案1】:

    您正在生成多个进程。由于虚拟内存的魔力,您不能(绝对不能)期望两个不同的进程具有相同的地址。

    关于你的问题:

    有没有办法以某种方式保持相同的实例?

    并非如此,因为您正在启动单独的进程。虽然如果您坚持,您可以使用“共享内存”在进程之间共享数据结构的单个实例。

    【讨论】:

    • 在我提供的示例中如何使用共享内存?我认为使用管理器与共享内存相同,但在这种情况下我也会得到不同的地址。
    • 我可能弄错了,但由于 GIL 阻止了真正的共享内存,mp.Process 的参数不是序列化的吗?
    • @Chicony:如果您使用管理器,您可以获得共享,但由于“虚拟内存”,地址仍然会有所不同。阅读虚拟内存,你会看到。当您谈论两个不同的进程时,仅仅因为两个事物存在于两个不同的虚拟地址并不能告诉您它们是否是同一个实例。
    猜你喜欢
    • 2021-11-04
    • 1970-01-01
    • 2016-02-13
    • 2023-03-07
    • 1970-01-01
    • 2020-05-23
    • 2017-05-28
    • 2015-10-15
    • 2017-05-06
    相关资源
    最近更新 更多