Ошибка многопроцессорной обработки

#python #multiprocessing

#python #многопроцессорная обработка

Вопрос:

На платформе Windows эти две строки заставляют выполнение кода Python выполняться в бесконечном цикле с каждым циклом, начинающимся с начала скрипта:

 import multiprocessing as mp
manager=mp.Manager()
  

Он отлично работает на Mac. В чем может быть причина? Он успешно импортирует import multiprocessing as mp . Но при manager=mp.Manager() этом прерывается (без ошибок) и возвращается к первой строке кода.

Ответ №1:

В Windows вы должны защищать вызовы multiprocessing с if __name__ == "__main__": помощью . Подробнее о том, почему это требуется, смотрите здесь. Это должно работать нормально:

 import multiprocessing as mp

if __name__ == "__main__":
    manager=mp.Manager()
  

Редактировать:

Обратите внимание, что размещение вашего multiprocessing кода внутри функций, которые вы вызываете из if блока, тоже нормально. Вот так:

 import multiprocessing as mp

def func(x):
   print("Got %s" % (x,))

def main():
  p = multiprocessing.Pool()
  results = p.map(func, range(0,5))

if __name__ == "__main__":
  manager = mp.Manager()
  main()
  

Комментарии:

1. Итак, я должен переместить импорт в if name==main область видимости?

2. Спасибо за помощь! Спасибо!

3. @Sputnix Нет проблем. Просто обратите внимание, что все ваши вызовы, которые включают создание нового процесса с помощью multiprocessing (например, создание Pool or Process ), должны выполняться внутри if __name__ ... блока.

4. Должен ли я тоже поместить pool.map_async(functName, ['arg1','arg2','arg3']) inside of if __name__=="__main__" ?

5. @Sputnix Да, это тоже.