【问题标题】:Python multiprocessing - Modify JSON via multiple processesPython 多处理 - 通过多个进程修改 JSON
【发布时间】:2017-03-05 12:36:56
【问题描述】:

我正在尝试使用multiprocessing 修改 JSON 文件。我将能够将 JSON 拆分为块,以便每个进程只能访问和修改 JSON 的某个部分(因此可以保证没有两个进程想要修改相同的属性)。我的问题是,如何在进程之间共享 JSON 对象,以便将更改反映在原始对象上?我知道,multiprocessing 将对象作为副本传递,所以我需要使用Manager(),但我该怎么做呢?目前我有

def parallelUpdateJSON(datachunk):
    for feature in datachunk: 
        #modify chunk

def writeGeoJSON():
    with open('geo.geojson') as f:
        data = json.load(f)
    pool = Pool()
    for i in range(0, mp.cpu_count())):
        #chunk data into a list, so I get listofchunks = [chunk1, chunk2, etc.,]
        #where chunk1 = data[0:chunksize], chunk2 = data[chunksize:2*chunksize] etc.
    pool.map(parallelUpdateJSON, listofchunks)
    pool.close()
    pool.join()
    with open('test_parallel.geojson', 'w') as outfile:
        json.dump(data, outfile)

当然,这会将块作为副本传递,因此原始 data 对象不会被修改。我怎样才能让data 真正被进程修改?谢谢!

【问题讨论】:

  • 您需要使用一个队列来放置要修改的 json 对象,并使用另一个队列来放置结果

标签: python json multiprocessing python-multiprocessing


【解决方案1】:

最好避免同步访问您的输出文件。只生成 N 个部分输出并将它们连接到您的 json 对象的属性中会容易得多。然后您可以将该对象转储到文件中。

def process(work):
    return str(work[::-1])

if __name__ == "__main__":
    p = Pool()
    structure = json.loads("""
    { "list":
        [
            "the quick brown fox jumped over the lazy dog",
            "the quick brown dog jumped over the lazy fox"
        ]
    }
    """)
    structure["results"] = p.map(process, structure["list"])
    #print(json.dumps(structure))
    with open("result.json", "w") as f:
        json.dump(structure, f)

【讨论】:

  • 谢谢,我也必须在 parallelUpdateJSONreturn datachunk 对吗?
  • 另外,我得到了TypeError: 'ApplyResult' object is not iterable
  • 可能是因为documentation 声明“func 仅在池的一个工作人员中执行”,因此它不会将函数映射到所有块,它只是启动一个进程.
  • 对不起。 apply_async 是错误的,应该是映射的。然而,本质是不共享工人之间的结果。
  • @ite__:是的,您必须将您的parallelUpdate 视为返回结果的(顺序!)函数。
猜你喜欢
  • 2018-10-27
  • 2016-01-18
  • 2021-07-16
  • 2019-09-16
  • 1970-01-01
  • 2013-03-29
  • 1970-01-01
  • 2021-05-22
  • 1970-01-01
相关资源
最近更新 更多