Что я пропускаю или делаю неправильно в следующем файле 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)

Вот скриншот того, что происходит, когда я запускаю его. введите описание изображения здесь

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

0
AmirHosein Sadeghimanesh 8 Окт 2018 в 11:37

2 ответа

Лучший ответ

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

следует защищать "точку входа" программы с помощью if __name__ == '__main__'

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

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

3
bruno desthuilliers 8 Окт 2018 в 09:07

Вы должны использовать идиому «имя модуля»:

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 перечитывает модуль (выполняет его) и попадает в бесконечный цикл.

2
quamrana 8 Окт 2018 в 08:43