Write () с многопроцессорной обработкой: встроенная блокировка для предотвращения искаженного вывода?

#python #python-3.x #file #multiprocessing

#python #python-3.x #файл #многопроцессорная обработка

Вопрос:

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

Для потомков это был мой первоначальный вопрос:

Я надеюсь, что кто-нибудь может помочь мне понять, что я вижу.

Я начал с одного процесса, который записывает несколько файлов. Со временем это превратилось в несколько процессов (с использованием ProcessPoolExecutor из concurrent.futures). Во время этой эволюции я непреднамеренно столкнулся с параллельной записью нескольких процессов в одни и те же файлы.

Что меня озадачивает, так это то, что кажется, что все работает нормально. По крайней мере, на сегодняшний день (и это были месяцы генерации миллионов строк данных каждый день), я не наблюдал ни одной искаженной записи. Возможно ли, что где-то есть какая-то встроенная защита, которая каким-то образом «распыляет» мои write() ы, не позволяя им прерывать друг друга?

Черт возьми, я использую Python 3.4.

Кстати, в ответ на некоторые комментарии ниже, в дополнение к записи требуется много вычислений, поэтому мне нужны процессы, а не потоки. И существует более 32 процессоров, пишущих текстовые строки из 300-400 символов. Еще раз спасибо за ваш вклад, ребята.

Комментарии:

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

2. Обеспечение записи — это все, что делают процессы. Если они выполняют какую-либо значимую вычислительную работу, потоки не будут столь эффективными.

3. Я не знаю о какой-либо неявной синхронизации, которая могла бы произойти. Сколько процессов записывают одновременно? Какой длины строки? Это может быть просто случайностью, если условия делают столкновения редкими.

4. Это также зависит от того, как вы выполняете сброс на диск. Если вы записываете только полные строки одновременно, конфликт будет просто означать, что некоторые строки пропущены (потому что один процесс перезаписывает изменения, внесенные другим), и искажения не произойдет. Вы могли бы открыть свой файл исключительно при записи (режим ‘x’), поэтому открытие файла из другого процесса завершилось бы неудачей — и добавить обработку в случае сбоя (например, подождите немного и повторите попытку).

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