Python 2 многопроцессорная карта без исчерпывающего генератора - PullRequest
1 голос
/ 29 апреля 2020

У меня есть генератор, который загружает файлы с FTP. Я хочу запустить их параллельно, не исчерпывая генератор вместе. Я хочу, чтобы генератор лениво оценивался. Это возможно в Python 2?

    def parse_and_load(filename):
        raw_records, exchange_data = parser.parse(filename)
        loader.load(raw_records, exchange_data)

    with closing(mp.Pool(4)) as pool:
        pool.map(parse_and_load, downloader.get_files(self.date))

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

1 Ответ

1 голос
/ 29 апреля 2020

[ EDIT ] Извините, я говорил слишком рано.

Та же проблема обсуждается в Python Multiprocessing.Pool lazy iteration . Это указывает на то, что дизайн multiprocessing.map. Получение более ленивого поведения потребует смены инструментов. Некоторые предложения:

  • используйте pool.apply_async в сочетании с Queue для отправки нового задания после его завершения
  • используйте NuMap, как предложено в этом ответе нить

Так что, если я правильно понял, приведенное ниже решение не относится к вопросу ОП.


Вероятно, вас укусил chunksize аргумент (см. ссылка ). Что скрывается под капотом, так это то, что multiprocessing "группирует" аргументы в порции, чтобы ограничить межпроцессные издержки.

Вы должны повторить попытку с chunksize=1

...