Многопроцессорная обработка Python - когда используется общий объект, на который имеется ссылка? Когда это копируется?

У меня есть структура данных L (это может быть список, диктат, ...) и мне нужно несколько процессов для чтения из него. Я не хочу использовать multiprocessing.Manager потому что это медленно.

Сейчас если L никогда не изменялся, интернет сказал мне, что он не будет полностью скопирован дочерними процессами благодаря функции копирования при записи. Но что, если 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 ответ

Питон multiprocessing не разделяет память между процессами и передает объекты (включая вызываемую функцию) между процессами, выбирая их (представляя объект в виде строки). Поэтому, когда вы вызываете функцию в пуле, основной процесс должен выбрать функцию, передать выбранное представление функции каждому подпроцессу, а затем каждый подпроцесс должен удалить функцию, чтобы поместить функцию в свою отдельную память.

Другие вопросы по тегам