我想在Linux上的多处理库所做的子进程之间共享一个大的只读对象。我不想使用Manager()
,因为这会影响效果。
大对象不是数组,实际上是gmpy.xmpz
库中gmpy2
的列表。这意味着使用多处理库中的共享数组无法正常工作。
怎么做?
过去,当我使用python 2时,我可以在主进程中使用全局变量。只要我不以任何方式修改对象,子进程就可以读取它而无需在linux上复制对象。
但是,在用intel编译器重新编译python 2之后,不知何故这个技巧再也无法工作了。我也将我的代码迁移到python 3.同样的技巧仍然没有用。
旧代码:
import multiprocessing as mp
import numpy as np
def f(x):
n = 0
print(shared_obj[0], id(shared_obj))
def main():
global shared_obj
# 7Gb object. in the actual code, this is not an array
shared_obj = np.zeros(7e9/4, dtype=np.int32)
pool = mp.Pool(6)
result = pool.map_async(f, range(10))
pool.close()
result.get()
pool.join()
main()
错误:
self.pid = os.fork()
OSError: [Errno 12] Cannot allocate memory