多重处理不会重新创建obj

2024-03-29 14:07:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我创建了一个小代码段(原始代码要大得多),它调用一个创建对象的函数,但在一个进程池中:

import multiprocessing


class TestClass(object):
    pass


def func():
    obj = TestClass()
    cpname = multiprocessing.current_process().name
    print "{0}, Address: {1}".format(cpname, str(obj))


pool = multiprocessing.Pool(2)
results = [pool.apply_async(func) for _ in range(2)]

for res in results:
    res.get()

pool.close()
pool.join()

当我运行此代码时,得到以下输出:

PoolWorker-1, Address: <__main__.TestClass object at 0x7f05d3fdad50>
PoolWorker-2, Address: <__main__.TestClass object at 0x7f05d3fdad50>
  1. 我不明白的是,为什么对象有相同的地址,即使它们在不同的进程中?

  2. 如何确保每个进程都创建自己的对象?

非常感谢你的帮助。你知道吗


Tags: 代码inobjforobject进程addressres
3条回答

当您fork()进行多重处理时,它会复制您的进程。内存分配器和父进程中的所有地址都将复制到子进程中。因此,下一次分配很可能会有相同的地址。你知道吗

您可以验证它们实际上是独立的对象,如下所示:

import time

def func():
    obj = TestClass()
    obj.name = multiprocessing.current_process().name
    print obj.name, str(obj)
    time.sleep(1)
    print obj.name, str(obj)

似乎您使用的是Linux ish系统,新进程是通过fork()创建的。在这种情况下,地址之间应该有大量的重叠。这并不意味着obj实例占用相同的物理内存—只是它们共享相同的虚拟(进程本地)地址。你知道吗

更多信息:

What happens to address's, values, and pointers after a fork()

对象不同,不同进程使用不同的virtual address space,不同进程中相同的地址指向不同的内存区域。你知道吗

如果稍微更改一下示例,您将看到返回的对象是不同的:

import multiprocessing

class TestClass(object):
    pass

def func():
    obj = TestClass()
    cpname = multiprocessing.current_process().name
    print "{0}, Address: {1}".format(cpname, str(obj))
    return obj

pool = multiprocessing.Pool(2)
results = [pool.apply_async(func) for _ in range(2)]

results = [res.get() for res in results]

pool.close()
pool.join()

print results

相关问题 更多 >