Почему 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 шт):

Автор решения: eri

Из map надо бы вычитывать результат. Возможно gc на линуксе кушает фьючерсы раньше чем они запустились. Ведь их никто не ждет.

Модуль concurrent я бы рекомендовал использовать через asyncio, а не напрямую.

Ну а если нельзя запускать луп, то тредовый мап есть в multiprocessing.dummy.Pool().map()

→ Ссылка