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

问题描述 投票:0回答:1

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

我有主文件处理代码作为一个函数。如果我正常运行代码,那么主文件列表会被适当填充,但是当我使用Pool和map运行它时,它总是为空。

例如

# 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并行化,则生成的master_list为空,即使temp_list中存在所有正确的数据,并且此数据也会附加到master_list(我可以从myfunc函数中的print语句中看到) 。

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

print(master_list) # master_list is empty

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

我错过了有关游泳池和地图如何协同工作的内容吗?我认为这可能是一个队列问题,但是肯定限制在单个处理器会修复空的master_list,它不会?

欢迎任何建议

python multiprocessing pool
1个回答
0
投票

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

master_list = pool.map(myfunc, file_list)

简而言之,在运行多线程时,附加到列表不起作用。因此,您应该从函数返回单个列表,然后使用池对象将它们汇集在一起​​。

© www.soinside.com 2019 - 2024. All rights reserved.