0

Я уже много месяцев общался с Multiprocessing, пытаясь выяснить элегантное повторяемое решение моей проблемы: нужно, чтобы несколько процессов записывали в один и тот же файл, не вступая друг в друга.Ошибка травления на concurrent.Futures.PoolProcessExecutor - как заблокировать?

Я использовал взаимопроводимость/потребительские отношения для преодоления этих препятствий в прошлом. Хорошие статьи и сообщения, которые я нашел, включают:

Я попытался реализовать функцию, аналогичную общему счетчику, описанный здесь:

Я стал большим поклонником простоты concurrent.Futures ProcessPoolExecutor и с помощью карты на каждом исполнителе, как описано здесь:

Сегодня вечером, я думал, что нашел ответ на мой поиск, открыв модуль под названием крепеж для readwrit e locks, но, по-видимому, этот подход работает только с потоками.

ВОПРОС: Есть элегантное, простое решение для обмена блокировки, так что все процессы от ProcessPoolExecutor не перезаписывать друг друга при записи в файл?

ПРИМЕЧАНИЕ: Я пишу около 800 м строк ~ 200 полей в один файл, используя csv.DictWriter. Другие рекомендации приветствуются.

+0

Я просто попытался использовать глобальные переменные и настройки блокировки, если не установлен в качестве глобальной переменной. Все еще открыт для лучших решений. Может быть, joblib? – ccdpowell

ответ

0

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

С этой точки зрения, есть много вопросов, похожих на ваш на stackoverflow.

Python multiprocessing safely writing to a file

Writing to a file with multiprocessing

Python Multiprocessing using Queue to write to same file