有关Python锁定的查询

问题描述 投票:0回答:1

假设我有 N 个进程打开一个 json 文件并像这样写入它 -

with open(thefile, ‘w’) as jsonfile:
    json.dump(somedata, jsonfile)

如果我想锁定这个文件,这样就没有进程读取垃圾数据,我应该锁定该文件(通过使用 multiprocessing.Lock)还是将其锁定为关键部分 - lock=Lock() with lock: ...与之前的代码相同

还有什么区别?

基本上我想要的是,即使有一个进程正在到达代码的该部分,在锁被释放之前,其他进程也不应该能够运行该部分代码。

目前我的实现是这样的-

import blah blah
lock = multiprocessing.Lock()

def some_method(parameters):

    with lock:
        with open(json_file_path, 'r', encoding='utf-8', errors='replace') as json_file:
            data = json.load(json_file)
        for key, value in data.items():
            if isinstance(value, dict) and value.get("path") == values["path"]:
                try:
                    value["questions"] = new_questions
                except Exception as e:
                    raise Exception("Value is", value, "\n", f"An error occurred: {str(e)}")
                break
        with open(json_file_path, 'w', encoding='utf-8', errors='replace') as json_file:
            json.dump(data, json_file, indent=4)

with Pool(5) as pool:
    rows = []
    results = pool.starmap(some_method, [parameters])
    rows.extend(results)
    pool.close()
    pool.join()

这段代码没有填写每个变量,但我只是想了解该函数正在做什么(读取和写入 json,以及我没有添加到这段代码中的更多功能)。我收到了有关某些 json 问题的错误,并使用一个进程运行修复了该问题,这使我相信我的代码的多处理方面存在问题。

python python-multiprocessing
1个回答
0
投票

正如 @Barmar 提到的,多处理锁仅在同一脚本中的进程之间起作用。不相关的进程之间可以使用文件锁。怀疑是一样的。我尝试使用 FileLock 库,似乎解决了问题。

© www.soinside.com 2019 - 2024. All rights reserved.