Как контролировать доступ к файлу из нескольких процессов в Python - PullRequest
0 голосов
/ 06 июля 2018

Я застрял в поиске решения проблемы многопроцессорности ниже

У меня есть класс Record в модуле record.py. Ответственность класса записей заключается в обработке входных данных и сохранении их в файл JSON. Класс Record имеет метод put () для обновления файла JSON.

Класс записи инициализируется в декораторе класса. Декоратор применяется к большинству классов различных подмодулей. Decorator извлекает информацию о каждом декорируемом методе и отправляет данные в метод put () класса Record. Метод put () класса Record затем обновляет файл 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 голосов
/ 06 июля 2018

Вы когда-нибудь слышали о концепции критической секции в многопроцессорном / многопоточном программировании?

Если это так, подумайте об использовании многопроцессорных блокировок , чтобы позволить только одному процессу одновременно записывать в файл.

0 голосов
/ 06 июля 2018

Вы должны заблокировать файл перед чтением и записью. Проверьте еще один вопрос, связанный с блокировкой файлов в python: Блокировка файла в Python

...