Несколько параллельных процессов записывают в один файл в кластере SGE - PullRequest
0 голосов
/ 15 апреля 2020

В настоящее время я работаю над кластером SGE, и у меня есть код, который отправляет множество заданий, записанных в python, параллельно.

Вывод в конце моего кода представляет собой набор файлов, содержащих числовые данные. Каждое задание python выполняет некоторые вычисления и затем по очереди выводит их в каждый файл. Для вывода в файл мой код считывает данные в файле, добавляет к ним то, что он вычислил, а затем выводит обратно в файл.

Моя проблема заключается в следующем; поскольку все задания выполняются параллельно, и все задания вносят свой вклад в каждый из выходных файлов; мои работы противоречат друг другу. Я часто получаю ошибки, касающиеся несовместимых размеров файлов и тому подобное. Я считаю, что иногда два задания пытаются прочитать файл в одно и то же время и конфликтуют.

У меня такой вопрос: при параллельном запуске (потенциально много) нескольких заданий, каждое из которых вносит свой вклад в один и тот же файл несколько раз, есть ли хороший способ убедиться, что они не пытаются записать в файл одновременно? Существуют ли какие-либо решения этой проблемы pythoni c или SGE?

Моя новая идея заключалась в том, чтобы иметь txt-файл, содержащий 1 или 0, указывающий, осуществляется ли доступ к файлу в данный момент, и что задание будет записывать в файл только тогда, когда значение установлено на 0, и будет изменять значение на 1 во время вывода. Это плохая практика? / Тупая идея?

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Обычной практикой для обеспечения безопасности в нескольких потоках (то есть задачах, выполняющихся в параллельном процессе в одном и том же процессе) является использование мьютекса . Поскольку это будет выполняться в нескольких процессах, блокировку необходимо получить вне процесса.

То, что вы описываете как решение, представляет собой упрощенную версию механизма блокировки. Вы можете сохранить значение или файл, например заблокировать file1.txt, создав file1.txt.lock и убедиться, что такого файла не существует до записи в file1.txt.

Однако, поскольку это общая проблема, уже существует несколько доступны механизмы блокировки файлов, в том числе из python.

В соответствии с этой записью вы можете заблокировать файл следующим образом:

from filelock import FileLock

with FileLock("myfile.txt.lock"):
    print("Lock acquired.")
    with open("myfile.txt"):
        # work with the file as it is now locked

Пожалуйста, посмотрите в комментариях и других ответах, чтобы найти альтернативные решения о том, как наилучшим образом получить блокировку для файлов в вашей конкретной c потребности.

0 голосов
/ 16 апреля 2020

Вы можете сохранить дизайн простым, записывая каждый параллельный процесс в отдельный файл. Затем, когда все процессы будут завершены, сделайте окончательный процесс, соберите все результаты и объедините их в один выходной файл. Это обычная схема для конвейеров обработки HP C.

...