Многопроцессорная обработка 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
не разделяет память между процессами и передает объекты (включая вызываемую функцию) между процессами, выбирая их (представляя объект в виде строки). Поэтому, когда вы вызываете функцию в пуле, основной процесс должен выбрать функцию, передать выбранное представление функции каждому подпроцессу, а затем каждый подпроцесс должен удалить функцию, чтобы поместить функцию в свою отдельную память.