我想在共享内存中使用numpy数组与多处理模块一起使用.困难是使用它像一个numpy数组,而不仅仅是一个ctypes数组.
from multiprocessing import Process, Array
import scipy
def f(a):
a[0] = -a[0]
if __name__ == '__main__':
# Create the array
N = int(10)
unshared_arr = scipy.rand(N)
arr = Array('d', unshared_arr)
print "Originally, the first two elements of arr = %s"%(arr[:2])
# Create, start, and finish the child processes
p = Process(target=f, args=(arr,))
p.start()
p.join()
# Printing out the changed values
print "Now, the first two elements of arr = %s"%arr[:2]
Run Code Online (Sandbox Code Playgroud)
这会产生如下输出:
Originally, the first two elements of arr = …Run Code Online (Sandbox Code Playgroud) 我已经阅读了很多有关共享数组的问题,对于简单的数组来说这似乎很简单,但我仍然试图让它适用于我拥有的数组.
import numpy as np
data=np.zeros(250,dtype='float32, (250000,2)float32')
Run Code Online (Sandbox Code Playgroud)
我尝试以某种方式mp.Array接受它data,尝试将其转换为共享数组,我也尝试使用ctypes创建数组:
import multiprocessing as mp
data=mp.Array('c_float, (250000)c_float',250)
Run Code Online (Sandbox Code Playgroud)
我设法使代码工作的唯一方法是不将数据传递给函数,而是将编码的字符串传递给未压缩/解码,但最终会调用n(字符串数)进程,这似乎是多余的.我希望的实现是基于将二进制字符串列表切换为x(进程数)并传递此块,data以及a index除了data在本地修改之外的有效进程,因此关于如何使其共享的问题,任何示例工作使用自定义(嵌套)numpy数组已经是一个很好的帮助.
PS:这个问题是Python多处理的后续问题
我想multiprocessing从这个例子开始尝试不同的使用方法:
$ cat multi_bad.py
import multiprocessing as mp
from time import sleep
from random import randint
def f(l, t):
# sleep(30)
return sum(x < t for x in l)
if __name__ == '__main__':
l = [randint(1, 1000) for _ in range(25000)]
t = [randint(1, 1000) for _ in range(4)]
# sleep(15)
pool = mp.Pool(processes=4)
result = pool.starmap_async(f, [(l, x) for x in t])
print(result.get())
Run Code Online (Sandbox Code Playgroud)
这里l是一个列表,当生成4个进程时,它会被复制4次.为避免这种情况,文档页面提供了使用队列,共享数组或代理对象multiprocessing.Manager.对于最后一个,我改变了以下定义l:
$ diff multi_bad.py multi_good.py
10c10,11
< l …Run Code Online (Sandbox Code Playgroud) 我正在使用多处理模块来分叉子进程.因为在分叉时,子进程获取父进程的地址空间,我得到父进程和子进程的相同记录器.我想清除父进程中携带的任何值的子进程的地址空间.我知道多处理在较低级别执行fork()而不执行exec().我想知道在我的情况下使用多处理是否合适,还是应该使用os.fork()和os.exec()组合,还是有其他解决方案?
谢谢.