Что произойдет, если два сценария Python захотят написать в одном файле? - PullRequest
10 голосов
/ 19 октября 2011

У меня есть конвейер, который в какой-то момент разделяет работу на различные подпроцессы, которые выполняют одно и то же параллельно.Таким образом, их вывод должен идти в один и тот же файл.

Не слишком ли рискованно говорить, что все эти процессы должны записывать в один и тот же файл?Или python пытается повторить попытку, если видит, что этот ресурс занят?

Ответы [ 5 ]

8 голосов
/ 19 октября 2011

Это зависит от системы. В Windows ресурс заблокирован, и вы получаете исключение. В Linux вы можете записать файл с двумя процессами (записанные данные могут быть смешаны)

В идеале в таких случаях следует использовать семафоры для синхронизации доступа к общим ресурсам.

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

Редактировать : Как было отмечено в более позднем посте , менеджер ресурсов является еще одной альтернативой для обработки одновременно работающих писателей

7 голосов
/ 19 октября 2011

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

Я бы рекомендовал записывать в отдельные файлы и объединять (или просто оставлять их как отдельные файлы).

3 голосов
/ 19 октября 2011

Лучшим решением является реализация менеджера ресурсов (писателя), чтобы не открывать один и тот же файл дважды.Этот менеджер может использовать механизмы синхронизации потоков (threading.Lock), чтобы избежать одновременного доступа на некоторых платформах.

2 голосов
/ 19 октября 2011

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

0 голосов
/ 26 апреля 2018

Используйте multiprocessing.Lock () вместо threading.Lock ().Просто предупреждение!может замедлить вашу возможность одновременной обработки, потому что один процесс просто ожидает снятия блокировки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...