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



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

我有主文件处理代码作为一个函数。 如果我正常运行代码,则主文件列表会适当填充,但是当我使用 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 并行化函数,即使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?

欢迎任何建议

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

master_list = pool.map(myfunc, file_list)

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

相关内容

  • 没有找到相关文章

最新更新