Python多处理:在多处理命令中检索数组

时间:2017-01-23 23:16:52

标签: python multiprocessing python-multiprocessing

我正在尝试运行多处理函数并以某种方式将其输出存储在数组中,但似乎无法找到这样做的方法。 这是我到目前为止所得到的:

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)

2 个答案:

答案 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)