使用多处理映射时,写入到函数外部的列表时出现问题

时间:2019-04-01 10:13:05

标签: python multiprocessing pool

我有一些代码正在尝试并行运行以加快速度。简而言之,脚本会遍历多个文件,并从每个文件中提取一个数据帧,对该数据帧进行一些计算,然后将文件名和提取/计算的数据写入临时列表,然后由于这是临时列表,因此在处理每个新文件时被覆盖,它将被添加到主列表中,脚本完成后,该主列表应包括所有已处理的文件。

我具有主要的文件处理代码功能。如果我正常运行代码,则将适当填充主文件列表,但是当我使用Pool运行它并映射时,它始终为空。

例如

# some code to generate file list as file_list

master_list = []

def myfunc(fle):
    with open fle as f: # long set of data extraction instructions

    temp_list.insert(filename, 0)
    temp_list.insert(data1, 1)
    temp_list.insert(data2, 2)

    print(temp_list) # check temp list in func works and it does

    append.master_list(temp_list)

    print(master_list) # master_list in func correctly contains temp_list data

如果我正常调用此函数,一切正常。

for i in file_list:
    myfunc(i)

print (master_list) # master_list is populated with data from all files

但是,如果我尝试将函数与pool.map并行化,则即使temp_list中存在所有正确的数据,并且将这些数据附加到master_list中,所得的master_list也为空(如我从打印语句中看到的那样) myfunc函数)。

pool = Pool(4) 
pool.map(myfunc, file_list)
pool.close()
pool.join() 

print(master_list) # master_list is empty

奇怪的是,当我将池限制为1个处理器时,甚至会发生这种情况     游泳池=游泳池(1)

我是否想知道池和地图如何协同工作?我以为这可能是队列问题,但是一定要限制为单个处理器才能修复空的master_list,这不是吗?

欢迎任何建议

1 个答案:

答案 0 :(得分:0)

尝试从myfunc返回列表,而不将其附加到主列表,然后执行以下操作:

master_list = pool.map(myfunc, file_list)

简而言之,运行多线程时,追加到列表不起作用。因此,您应该从函数中返回单个列表,然后使用pool对象将其合并在一起。