我创建了一个小代码段(原始代码要大得多),它调用一个创建对象的函数,但在一个进程池中:
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>
我不明白的是,为什么对象有相同的地址,即使它们在不同的进程中?
如何确保每个进程都创建自己的对象?
非常感谢你的帮助。你知道吗
当您
fork()
进行多重处理时,它会复制您的进程。内存分配器和父进程中的所有地址都将复制到子进程中。因此,下一次分配很可能会有相同的地址。你知道吗您可以验证它们实际上是独立的对象,如下所示:
似乎您使用的是Linux ish系统,新进程是通过
fork()
创建的。在这种情况下,地址之间应该有大量的重叠。这并不意味着obj
实例占用相同的物理内存—只是它们共享相同的虚拟(进程本地)地址。你知道吗更多信息:
What happens to address's, values, and pointers after a fork()
对象不同,不同进程使用不同的virtual address space,不同进程中相同的地址指向不同的内存区域。你知道吗
如果稍微更改一下示例,您将看到返回的对象是不同的:
相关问题 更多 >
编程相关推荐