我正在尝试运行多处理函数并以某种方式将其输出存储在数组中,但似乎无法找到这样做的方法。 这是我到目前为止所得到的:
resultsAr = []
inputData = [a,b,c,d]#THIS ARRAY CONTAINS DATA
def function(data):
values = [some_Number_1, some_Number_2]
resultsAr.append(values)
print ('Values = ', values) #THIS WORKS - THE CORRECT VALUES ARE PRINTED
print ('resultsAr = ', resultsAr) #WORKS AS WELL
def parallel_run(function, inputData): #a function that runs in multiple processors
cpu_no = 4
if len(inputData) < cpu_no:
cpu_no = len(inputData)
p = multiprocessing.Pool(cpu_no)
p.starmap_async(function, inputData, chunksize=1)
p.close()
p.join()
print ('resultsAr = ', resultsAr) # THIS PRINTS OUT AN EMPTY ARRAY!
parallel_run(function, inputData)
答案 0 :(得分:1)
正在发生的事情是Python在您的池中为您启动子进程,然后将输入数据复制到该进程。子进程现在有原始副本,您的function
正在改变该副本。这就是为什么突变出现在function
的打印陈述中。但是,您不是在父进程中将其变回,因此当执行返回到该进程时,原始resultsAr
尚未更改。
执行此处描述的规范方法是使用Pool.map
调用,如下所示:
resultsAr = []
inputData = [a,b,c,d]
def function(data):
values = [some_Number_1, some_Number_2]
return values
def parallel_run(function, inputData):
cpu_no = 4
if len(inputData) < cpu_no:
cpu_no = len(inputData)
p = multiprocessing.Pool(cpu_no)
# this needs to be declared global to mutate
# the resultsAr defined in the enclosing scope
global resultsAr
resultsAr = p.map(function, inputData, chunksize=1)
p.close()
p.join()
print ('resultsAr = ', resultsAr)
此外,您提供的示例应抛出异常,因为您将参数(inputData
的元素)传递给不带参数的函数(function
)。我假设你实际上想要function
中的参数。
答案 1 :(得分:0)
根据上面的答案,我发现pool.starmap_async
检索一个不可迭代的实例。这已通过在代码中添加get
表达式来解决,如下所示:
resultsAr = []
inputData = [a,b,c,d]
def function(data):
values = [some_Number_1, some_Number_2]
return values
def parallel_run(function, inputData):
cpu_no = 4
if len(inputData) < cpu_no:
cpu_no = len(inputData)
p = multiprocessing.Pool(cpu_no)
global resultsAr
resultsAr = p.starmap_async(function, inputData, chunksize=1)
real_result = resultsAr.get()
p.close()
p.join()
print ('real_result = ', real_result)