Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何将共享对象传递到multiprocessing.pool(无需酸洗或使用全局变量)?_Python 3.x_Numpy_Python Multiprocessing - Fatal编程技术网

Python 3.x 如何将共享对象传递到multiprocessing.pool(无需酸洗或使用全局变量)?

Python 3.x 如何将共享对象传递到multiprocessing.pool(无需酸洗或使用全局变量)?,python-3.x,numpy,python-multiprocessing,Python 3.x,Numpy,Python Multiprocessing,多处理说继承(来自祖先进程)比pickle/unpickle共享资源(从而避免使用管道/队列)更好 不过,它还表示,最好明确地传递资源,而不是作为全球资源共享 那么,如何传递共享资源,例如,传递给映射函数 此示例显示共享全局函数可以工作(但不是显式的) 但显式传递不起作用(可能是某些队列中的酸洗破坏了共享连接): 建议将资源作为initargs参数传递给Pool,并编写initialize函数将其分配给每个进程下的新全局。这可能更便于携带,但看起来不太干净。 import multiproce

多处理
说继承(来自祖先进程)比pickle/unpickle共享资源(从而避免使用管道/队列)更好

不过,它还表示,最好明确地传递资源,而不是作为全球资源共享

那么,如何传递共享资源,例如,传递给映射函数


此示例显示共享全局函数可以工作(但不是显式的)

但显式传递不起作用(可能是某些队列中的酸洗破坏了共享连接):

建议将资源作为
initargs
参数传递给
Pool
,并编写
initialize
函数将其分配给每个进程下的新全局。这可能更便于携带,但看起来不太干净。
import multiprocessing.sharedctypes
import numpy as np

def task(i):
    global x
    x[i] = i

sharedresource = multiprocessing.sharedctypes.RawArray('b', 10)
x = np.frombuffer(sharedresource, dtype=np.uint8)

with multiprocessing.Pool(4) as pool:
    pool.map(task, range(10)) # implicitly modify x

print(x) # [0 1 2 3 4 5 6 7 8 9]
def task2(i, array):
    array[i] = 7

with multiprocessing.Pool(4) as pool:
    pool.starmap(task2, ((i,x) for i in range(10))) # explicit fail

print(x) # still [0 1 2 3 4 5 6 7 8 9]