Простой параллельный расчет с многопроцессорной обработкой не работает - PullRequest
0 голосов
/ 01 июля 2019

У меня есть простая, но очень трудоемкая функция, которую я хочу распараллелить, чтобы сделать ее быстрее. Это Python 3.6 на ноутбуке Jupyter. Я делаю что-то вроде этого:

from multiprocessing import Pool
def func(x):
    return x**2
y = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
with Pool(5) as pool:
    results = pool.imap_unordered(func, y)
for r in results:
    print(r)

И последнее утверждение выполняется вечно и никогда не заканчивается.

Что здесь не так?

1 Ответ

0 голосов
/ 01 июля 2019

У вас проблема с контекстными областями. Попробуйте переместить for r in results: петлю внутри with блока:

    with Pool(5) as pool:
        results = pool.imap_unordered(func, y)
        for r in results:
            print(r)

это отлично работает.

В качестве альтернативы, вы можете просто использовать Pool.map

from multiprocessing import Pool


def func(x):
    return x ** 2

if __name__ == '__main__':
    y = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    with Pool(5) as pool:
        results = pool.map(func, y)
    for r in results:
        print(r)

который печатает

1
4
9
16
25
36
49
64
81
100
...