我试图使用concurrent.futures
读取几个.json
文件,并将结果存储在列表中。下面是我的代码:
data = []
PATH_TO_JSON = '/media/My Passport/echo2_1'
def jsonread (file):
path = PATH_TO_JSON + '/' + file
with open(path, 'r', encoding='utf-8') as f:
for line in f:
data.append(json.loads(line.rstrip('\n|\r')))
with concurrent.futures.ProcessPoolExecutor() as executor:
files = [file for file in listdir(PATH_TO_JSON)]
results = executor.map(jsonread, files)
但是代码返回一个空的data
列表。我发现了一个类似的问题。但我无法将答案应用到我的工作中。我很感谢你的详细回答,因为我是multiprocessing
和concurrent.futures
的新手
每个进程都将从它们自己的内存开始。这使得在全局列表中共享数据变得困难。相反,请尝试重构
jsonread
方法以返回列表对于多进程代码,必须确保Python解释器可以导入主模块而不会产生副作用。每个进程将启动一个解释器,该解释器将加载主模块,因此必须确保只有主进程(第一个解释器)启动
ProcessPoolExecutor
。重构代码,在with
语句周围包含一个主保护:如果我们要在最后打印
results
的值,我们得到:你在这里看到的是我们有一个发电机。python中的生成器是懒惰的,它们在调用
next
之前不会做任何事情。因为我们更改了jsonread
以返回字符串列表,所以我们还必须将它们连接在一起。在jsonread
中的值上循环将隐式调用生成器上的next
。最终代码:相关问题 更多 >
编程相关推荐