2016-11-07 4 views
0

В настоящее время я работаю над алгоритмом асинхронного градиента с модулем многопроцессорности Python, основная идея заключается в том, что я запускаю несколько процессов, которые асинхронно обновляют массив глобальных параметров. Я закончил большую часть фреймворка, но у меня возникла проблема, что некоторые процессы иногда «застревают», а другие все еще работают, что делает этот алгоритм менее эффективным. Поэтому мне интересно, есть ли хорошие способы убедиться, что они используют примерно такое же количество времени?Как убедиться, что каждый процесс использует примерно столько же времени при использовании мультипроцессорного модуля в Python?

Спасибо!

+2

Должна быть причина или некоторые причины, по которым ваши подпроцессы «застревают». Без кода трудно другим понять, что происходит. Расскажите, что вы сделали, и как вы это делали, когда используете модуль «многопроцессорности». –

+0

@PhilipTzou Спасибо за ваш комментарий! В основном в каждом процессе я запускаю цикл, который вычисляет градиент, и в конце каждого цикла он обновляет глобальные параметры. Я не уверен, проблема в модуле многопроцессорности Python или в проблеме планирования Linux, поскольку разные процессы застревают в разное время и возобновляются после нескольких десятков или сотен секунд. Программа запускается на компьютере с 12 ядрами, и если я запускаю 6 процессов параллельно, использование ЦП может варьироваться от 100% до 600%, и я понятия не имею, почему. – username123

+0

@PhilipTzou BTW, иногда может показаться странным, что, хотя 'htop' показывает почти 0% использования ЦП в столбце данных, но панель использования процессора считывает 100% рабочую нагрузку. – username123

ответ

1

Это почти полностью зависит от проблемы, которую вы пытаетесь решить. Если вы распределите большую задачу нескольким работникам и один непредсказуемо получит гораздо больший кусок, чем другие, у вас будет такая ситуация.

Есть несколько вариантов, чтобы избежать этого:

  1. Попробуйте оценить усилия для каждой порции более точно. В зависимости от вашей задачи это возможно. Куски с наиболее прогнозируемыми усилиями должны быть разделены.
  2. Очень распространенный способ приблизиться к этому состоит в том, чтобы разделить задачу на множество очень маленьких кусков, гораздо больше, чем у рабочих. Затем загрузите все куски в очередь и пусть ваши рабочие съедят свои куски из очереди. Таким образом, когда работник получает легкий кусок, он быстро закончит его и сразу же выведет следующий кусок из очереди, таким образом, не закончив простоя, в то время как другие рабочие, похоже, «застряли» со своим более сложным куском.

Настоящий тупик не будет определен, конечно, любым подходом.

Смежные вопросы