如何从python中的多个进程控制对文件的访问

时间:2018-07-06 10:05:41

标签: python python-multiprocessing python-multithreading

我坚持寻找以下多重处理问题的解决方案。

在record.py模块中有一个Record类。记录类的职责是处理输入数据并将其保存到JSON文件中。 Record类具有方法put()来更新JSON文件。

记录类在类装饰器中初始化。装饰器应用于各种子模块的大多数类。 装饰器提取其装饰的每个方法的信息,并将数据发送到Record类的put()方法。 Record类的put()方法然后更新JSON文件。

问题在于,当不同的进程运行时,每个进程都会创建自己的记录对象实例,并且Json数据会因为 多个进程尝试更新相同的json文件。 此外,每个进程可能都有正在运行的线程试图访问和更新相同的JSON文件。 请让我知道如何解决这个问题。

class Record():
    def put(data):
        # read json file
        # update json file with new data
        # close json file

def decorate_method(theMethod):
    # Extract method details
    data = extract_method_details(theMethod)

    # Initialize record object
    rec = Record()
    rec.put(data)

class ClassDeco(cls):
    # This class decorator decorates all methods of the target class

    for method in cls():  #<----This is just a pseudo codebase
        decorate_method()

@ClassDeco
class Test()
    def __init__():
        pass

def run(a):
    # some function calls

if __name__ == "__main__":
    t = Test()
    p = Pool(processes=len(process_pool))
    p.apply_async(t.run, args=(10,))
    p.apply_async(t.run, args=(20,))
    p.close()

2 个答案:

答案 0 :(得分:0)

您应该在读写文件之前将其锁定。检查与python中的文件锁定有关的另一个问题:Locking a file in Python

答案 1 :(得分:0)

您是否听说过多处理/多线程编程中的critical section概念?

如果这样,考虑使用multiprocessing locks一次仅允许一个进程写入文件。