Многопроцессорный «Пул» зависает на работающей программе - PullRequest
0 голосов
/ 23 апреля 2019

Я написал программу для использования «пула» из многопроцессорного пакета python, но она продолжает зависать ядром (кстати, я использую Jupyter с Anaconda)

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

import multiprocessing as mp

def f(x):
   for i in x:
      return i+1

ar=[1,2,3,4,5]
def main():
    pool=mp.Pool(processes=4)
    pool.map(f,ar)
if __name__== '__main__':
    main()

Это показывает, что ядро ​​работает, но загрузка процессора составляет 0%.

1 Ответ

0 голосов
/ 23 апреля 2019

Проблема в том, что ar не входит в локальную область действия вашей основной функции, она находится над ней.Поместите его внутрь, и оно должно работать.

from multiprocessing import Pool

def f(x):
    return x+1

if __name__ == '__main__':
    ar=[1,2,3,4,5]
    with Pool(4) as p:
        print(p.map(f, ar))

Также учтите, что map берет вашу итерацию и присваивает ее всем процессам, по сути, она делает цикл for для вас.Таким образом, вы можете получить прямой доступ к x.

И, наконец, используя with в качестве диспетчера контекста, обеспечивает закрытие вашего пула после его завершения. [документы]

Редактировать: Я отредактировал и протестировал приведенный выше код, и мой отправляет правильные значения и закрывается правильно.

Этот код также работаетдля меня как в Spyder 3.2.6, так и в стандартном терминале.Оба фрагмента закрываются правильно и не зависают на моей машине.

import multiprocessing as mp

def f(x):
    return x+1

def main():
    ar = [1,2,3,4,5]
    pool = mp.Pool(processes=4)
    print(pool.map(f, ar))

if __name__ == '__main__':
    main()
...