Python多处理 - 何时共享引用的对象?什么时候复制?

时间:2016-06-22 14:37:00

标签: python python-3.x python-multiprocessing copy-on-write

我有一个数据结构L(它可能是一个列表,一个字典,......)我需要多个进程来读取它。我不想使用multiprocessing.Manager,因为它很慢。

现在如果永远不会修改Linternet告诉我,由于写时复制,它不会被子进程完全复制。但是如果L被对象a引用,它本身被修改了怎么办?写时复制仍然适用吗?例如:

from multiprocessing import Pool
from a import A

READONLYLIST = list(range(pow(10, 6)))  # list will never be modified
a = A(READONLYLIST)  # object a will be modified

def worker(x):
    return a.worker(x)

print(Pool(2).map(worker, range(10)))

将模块a设为:

import random

class A(object):
    def __init__(self, readonlylist):
        self.readonlylist = readonlylist
        self.v = 0

    def worker(self, x):
        self.v = random.random()  # modify the object
        return x + self.readonlylist[-1]

在这种情况下,子进程会READONLYLIST完全复制吗?

1 个答案:

答案 0 :(得分:1)

Python multiprocessing不会在进程之间共享内存,并通过对它们进行绑定(将对象表示为字符串)来传递进程之间的对象(包括被调用的函数)。因此,当您在池中调用函数时,主进程必须对函数进行pickle,将函数的pickled表示传递给每个子进程,然后每个子进程必须对函数进行depickle以将函数放入其自己的单独内存中。