我有一些代码,我试图并行运行以加快速度。简而言之,脚本遍历许多文件,并从每个文件中提取数据帧,对数据帧进行一些计算,然后将文件名和提取/计算的数据写入临时列表,然后由于这是临时列表,在处理每个新文件时覆盖它,它将附加到主列表,该列表应在脚本完成后包括所有已处理的文件。
我有主文件处理代码作为一个函数。如果我正常运行代码,那么主文件列表会被适当填充,但是当我使用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,它不会?
欢迎任何建议
尝试从myfunc返回列表而不将其附加到主列表,然后执行:
master_list = pool.map(myfunc, file_list)
简而言之,在运行多线程时,附加到列表不起作用。因此,您应该从函数返回单个列表,然后使用池对象将它们汇集在一起。