Python多处理:为什么对象实例没有相同的地址?

时间:2016-11-21 12:40:00

标签: python-2.7 python-multiprocessing

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

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

1 个答案:

答案 0 :(得分:1)

您正在产生多个流程。由于虚拟内存的神奇,你不能(绝不)期望两个不同的进程拥有相同的地址。

关于你的问题:

  

有没有办法以某种方式保持同一个实例?

不是,因为您正在开始单独的流程。虽然如果你坚持,你可以使用&#34;共享内存&#34;在进程之间共享数据结构的单个实例。