我有一个数据结构L
(它可能是一个列表,一个字典,......)我需要多个进程来读取它。我不想使用multiprocessing.Manager
,因为它很慢。
现在如果永远不会修改L
,internet告诉我,由于写时复制,它不会被子进程完全复制。但是如果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
完全复制吗?
答案 0 :(得分:1)
Python multiprocessing
不会在进程之间共享内存,并通过对它们进行绑定(将对象表示为字符串)来传递进程之间的对象(包括被调用的函数)。因此,当您在池中调用函数时,主进程必须对函数进行pickle,将函数的pickled表示传递给每个子进程,然后每个子进程必须对函数进行depickle以将函数放入其自己的单独内存中。