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