У меня есть процесс, который я пытаюсь распараллелить с библиотекой multiprocessing
. Каждый процесс выполняет несколько вещей, но одна из функций каждого процесса состоит в том, чтобы вызвать функцию, которая выполняет оптимизацию. Теперь 90% времени каждая оптимизация завершается менее чем за 1 минуту, но если этого не произойдет, она может никогда не сойтись. Существует внутренний механизм, который завершает функцию оптимизации, если она не сходится после, скажем, 20 000 итераций, но это может занять много времени (~ 1 час).
Прямо сейчас мой код выглядит примерно так:
pool = multiprocessing.Pool()
imap_it = pool.imap_unordered(synth_worker, arg_tuples)
while 1:
try:
result = imap_it.next(timeout=120)
process_result(result)
except StopIteration:
break
except multiprocessing.TimeoutError:
pass
pool.close()
pool.join()
Кажется, это работает довольно хорошо, так как я могу обработать первые 90% результатов довольно быстро, но ближе к концу более длинные процессы начинают тормозить, и только 1 процесс завершается каждые ~ 10 минут. Странно то, что как только я дошел до этой точки, и я запустил top
в терминале, кажется, что только 5-6 параллельных процессов работают, хотя у меня 24 пула в моем пуле. Я также вижу, что все 24 процессора задействованы в начале запуска. Между тем я вижу, что есть еще более 100 оставшихся задач, которые еще не завершены (или даже не запущены). Я не использую ни одну из встроенных опций чанкинга imap_unordered
, поэтому я понимаю, что, как только один процесс завершается, рабочий, который выполнял этот завершенный процесс, должен выбрать новый. Почему будет запущено меньше параллельных процессов, чем остающихся задач, если все оставшиеся задания уже не были выделены 5-6 застрявшим рабочим, которые ожидают, что их неконвергентная оптимизация достигнет своего предела 20 000 итераций? Есть идеи? Должен ли я попробовать другой способ перебора результатов моего пула по мере их поступления?
Вывод top
в начале цикла здесь
и вывод top
, когда задания застряли здесь
и это - вот как выглядит стандартный вывод, когда задания начинают зависать.