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]