Python 多处理:为什么对象实例不具有相同的地址?
Python multiprocessing: Why don't objects instances have the same adress?
我想知道为什么子进程打印出不同的对象地址。我也试过找经理,但不影响结果。
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
正在复制实例吗?有没有办法以某种方式保留相同的实例?我遇到了上面的更复杂版本的问题,其中 class 对象更复杂。在这种情况下我得到的结果是我在对象实例上设置的值在它们输入 mp.Process
后被取消,即 obj.get_name
returns None
。
您正在生成多个进程。多亏了虚拟内存的魔力,你不能(一定不能)期望两个不同的进程有相同的地址。
关于您的问题:
Is there a way to keep the same instance somehow?
不一定,因为您正在启动单独的进程。尽管如果您坚持,您可以使用 "shared memory" 在进程之间共享数据结构的单个实例。
我想知道为什么子进程打印出不同的对象地址。我也试过找经理,但不影响结果。
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
正在复制实例吗?有没有办法以某种方式保留相同的实例?我遇到了上面的更复杂版本的问题,其中 class 对象更复杂。在这种情况下我得到的结果是我在对象实例上设置的值在它们输入 mp.Process
后被取消,即 obj.get_name
returns None
。
您正在生成多个进程。多亏了虚拟内存的魔力,你不能(一定不能)期望两个不同的进程有相同的地址。
关于您的问题:
Is there a way to keep the same instance somehow?
不一定,因为您正在启动单独的进程。尽管如果您坚持,您可以使用 "shared memory" 在进程之间共享数据结构的单个实例。