Многопроцессорные процессы в состоянии непрерывного сна (D) при запуске из iPython Notebook

Я выполняю большое параллельное вычисление сопоставления из ноутбука iPython. Я сопоставляю кадр данных по предмету и условию с функцией прогнозирования машинного обучения, и я хочу, чтобы каждый предмет и условие были распределены между 20 ядрами.

def map_vars_to_functionPredict(subject,condition):
    ans = map(predictBasic, [subject],[df],[condition])
    return ans

def main_helperPredict(args):
    return map_vars_to_functionPredict(*args)

def parallel_predict(subjects, conditions):
    p = Pool(20) 
    # set each matching item into a tuple
    job_args = list(itertools.product(*[subjects,conditions]))

    print job_args
    # map to pool
    ans = p.map(main_helperPredict, job_args)

    p.close()
    p.join()

    return ans

Когда я запускаю эти функции из iPython Notebook после запуска ноутбука, они работают быстро и так, как ожидалось (в состоянии «Работает» при ~ 100% процессоре на 20 ядрах). Однако иногда, если я повторно запускаю функцию parallel_predict сразу после ее первого запуска, все 20 процессов без причины помечаются как находящиеся в состоянии непрерывного сна (D). Я ничего не пишу на диск, просто получаю результат как переменную в блокноте iPython.

В качестве последней попытки я попытался включить del p после p.join(), и это несколько помогло (функция работает нормально чаще), но у меня все еще иногда возникает проблема с процессами D, особенно если у меня много процессов в очереди.

Изменить:

В общем, добавление del p после p.join() не позволяло процессам переходить в состояние (D), но у меня по-прежнему была проблема, когда функция завершала все процессы (насколько я мог судить по top), но не возвращала результатов. Когда я остановил ядро ​​iPython Notebook, я получил ошибку ZMQError: Address already in use.

Как мне правильно запустить или завершить многопроцессорный пул, чтобы этого не произошло?


person Amyunimus    schedule 12.11.2015    source источник


Ответы (1)


Я изменил четыре вещи, и теперь 1) процессы больше не переходят в состояние (D) и 2) я могу запускать эти функции подряд, и они всегда возвращают результаты и не зависают.

К parallel_predict я добавил freeze_support() и заменил p.close() на p.terminate() (и добавил строку print, но я не думаю, что это имеет значение, но я включаю это, поскольку все это все равно суеверие). Я также добавил del p.

def parallel_predict(subjects, conditions):
    freeze_support()
    p = Pool(20) 
    # set each matching item into a tuple
    job_args = list(itertools.product(*[subjects,conditions]))

    print job_args
    # map to pool
    ans = p.map(main_helperPredict, job_args)

    p.terminate()
    p.join()
    del p

    print "finished"
    return ans

Наконец, я встроил строку, где я вызываю parallel_predict в if __name__ == "__main__", как таковую:

if __name__ == "__main__":
    all_results = parallel_predict(subjects,conditions)
person Amyunimus    schedule 24.11.2015