Python многопроцессорная обработка нескольких процессов в потоке - PullRequest
0 голосов
/ 17 мая 2018

В настоящее время я использую многопроцессорный модуль python с пулом для одновременного запуска функции миллионы раз. Хотя многопроцессорная обработка работает хорошо, эта функция настолько легка, что используется только 30% каждого ядра, а потоки максимизируются только во время блокировки (). Глядя на профиль моего скрипта, блокировка действительно самая дорогая.

Учитывая, что каждый запуск функции очень короткий, компромисс между блокировкой каждый раз, когда я сопоставляюсь с функцией, и запуском функции не стоит (на самом деле я получаю лучшую производительность, выполняя ее последовательно; 15 минут распараллеливаются) против 4,5 минут сериала).

Функция записывает в независимые файлы, поэтому вызовы полностью независимы. Можно ли «подражать» запуску / вызову одного и того же распараллеленного скрипта Python несколько раз (с разными входами), чтобы больше использовать процессор?

Текущий код:

pool = Pool(cpu_count(), initializer=tqdm.tqdm.set_lock, initargs=(Lock(),))

for _ in tqdm.tqdm(pool.imap_unordered(parallel_process, pubfiles, chunksize=70), total=nfiles, desc='Parsing files'):
  pass

EDIT:

Чтобы убедиться, что это не имеет ничего общего с блокировкой tqdm, изменение кода следующим образом решает ту же проблему:

    pool = Pool(cpu_count())
    for i in pool.imap_unordered(parallel_process, files, chunksize=70):
        print(i)

enter image description here

Я некоторое время профилировал свой код, и большинство дорогостоящих процессов, похоже, связано с блокировкой (?) / Многопроцессорностью в целом. Фактическая функция очень близка к нижней части времени обработки. enter image description here

1 Ответ

0 голосов
/ 27 мая 2018

Эта проблема не имела ничего общего с многопроцессорностью - мои функции были связаны с вводом-выводом, потому что каждый вызов считывал и записывал файл на диск, и это было узким местом при параллельной работе. Разбиение и уменьшение количества записанных файлов уменьшило это узкое место, и вышеописанный многопроцессорный код (параллелизм) работал отлично!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...