Проблема в том, что 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()