Почему ThreadPoolExecutor работает на MacOS, но перестает работать на Linux
Я столкнулся с проблемой
Я распараллелил процессы с помощью ThreadPoolExecutor
Вот пример:
with concurrent.futures.ThreadPoolExecutor() as executor:
executor.map(self.process_by_label, self.metrics)
Весь код не навожу, чтобы не путать никого
Метод self.process_by_label вычитывает данные с одного файла и на основании self.metrics записывает в множество других файлов. Исходный файл (с которого мы вычитываем данные) для всех процессов одинаковый.self.metrics - это по сути список на основании которого мы меняем контент и создаем множество новых файлов.
Исходный файл очень большой (124 GB). Его я вычитываю построчно, по этому проблем с оперативной памятью у меня нет.
Когда я этот скрипт запускаю локально на MACOS - у меня процессы распараллеливаются и все работает так как я ожидаю. Когда я переношу скрипт в клауд, где все работает на linux - процесс просто зависает.
Когда я запускаю все в одном процессе на MACOS и на linux - так же все работает
Вопрос: почему на linux логика может не работать?
Может ли это быть связано с тем, что все процессы читают с одного файла?
Или может это связано с какими то различиями реализации мультипроцессинга для linux и MACOS?
Буду благодарен за любые советы в этом направлении...
Спасибо
Ответы (1 шт):
Из map надо бы вычитывать результат. Возможно gc на линуксе кушает фьючерсы раньше чем они запустились. Ведь их никто не ждет.
Модуль concurrent я бы рекомендовал использовать через asyncio, а не напрямую.
Ну а если нельзя запускать луп, то тредовый мап есть в multiprocessing.dummy.Pool().map()