Что я делаю не так в этом файле с pool.map, который ничего не вызывает, и мне нужно перезапустить оболочку? - PullRequest
0 голосов
/ 08 октября 2018

Что я пропускаю или делаю неправильно в следующем файле python, используя многопроцессорность?Когда я запускаю его, ничего не происходит, и мне нужно перезапустить оболочку!

def f(x):
    lo=0
    for i in range(x):
            lo+=i
    return(lo)
from multiprocessing import Pool
def f_parallel(x1,x2,x3,x4):
    with Pool(processes=4) as pool:
        resulto_parallel=pool.map(f,[x1,x2,x3,x4])
    return(resulto_parallel)
f_parallel(1,2,3,4)

Вот скриншот того, что происходит, когда я запускаю его.enter image description here

А потом, подождав некоторое время, я просто перезагружаю оболочку.enter image description here

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Цитирование из многопроцессорной документации :

необходимо защитить «точку входа» программы, используя if __name__ == '__main__'

Inв вашем случае это выглядит так:

from multiprocessing import Pool

def f(x):
    lo = 0
    for i in range(x):
            lo += i
    return lo

def f_parallel(x1, x2, x3, x4):
    with Pool(processes=4) as pool:
        resulto_parallel = pool.map(f, [x1, x2, x3, x4])
    return resulto_parallel 

if __name__ == '__main__':    
    print(f_parallel(1, 2, 3, 4))

Ключевым моментом является то, что порожденные процессы будут импортировать ваш скрипт на python, что, если вы не защитите вызов f_parallel(1,2,3,4), приведет к бесконечному порождениюподпроцессы.

Примечание : Также добавлено print, так что результат вызова функции будет фактически установлен в stdout

0 голосов
/ 08 октября 2018

Вам необходимо использовать идиому «имя модуля»:

def f(x):
    lo = 0
    for i in range(x):
            lo += i
    return lo

from multiprocessing import Pool

def f_parallel(x1, x2, x3, x4):
    with Pool(processes=4) as pool:
        return pool.map(f,[x1, x2, x3, x4])

if __name__ == '__main__':
    print(f_parallel(1, 2, 3, 4))

Вывод:

[0, 1, 3, 6]

Без вышеприведенной части if __name__ == '__main__':, multiprocessing перечитывает модуль(выполняя его) и попадает в бесконечный цикл.

...