В настоящее время я использую многопроцессорный модуль 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)
Я некоторое время профилировал свой код, и большинство дорогостоящих процессов, похоже, связано с блокировкой (?) / Многопроцессорностью в целом. Фактическая функция очень близка к нижней части времени обработки.