Как повторно использовать работников пула в многопроцессорном коде? - PullRequest
0 голосов
/ 02 октября 2019

В приведенном ниже коде я получаю сообщение об ошибке «не могу получить атрибут f в модуле main ». Я знаю, как это исправить: довести строку пула и строку результата до чуть выше результата 2.

Мой вопрос заключается в том, почему код в его текущей форме не работает. Я работаю с более сложным кодом, где я должен использовать параллельную обработку внутри двух разных отдельных циклов for. Прямо сейчас у меня есть в каждой итерации каждого цикла for, pool = mp.Pool (3). Я читал в Интернете, что это плохо, потому что на каждой итерации я создаю все больше «рабочих» пула. Как я могу поместить pool = mp.Pool (3) на внешней стороне итерации, а затем использовать одни и те же рабочие пула во всех различных областях моего кода, которые мне нужны?

Для записи яЯ использую Mac для запуска моего кода.

import numpy as np
import multiprocessing as mp

x = np.array([1,2,3,4,5,6])

pool = mp.Pool(3)

def f(x):
    return x**2

result = pool.map(f,x)

def g(x):
    return x + 1

result2 = pool.map(g,x)
print('result=',result,'and result2=',result2)

1 Ответ

1 голос
/ 02 октября 2019

При использовании метода fork для создания подпроцессов (по умолчанию для Mac OS) процессы разветвляются (в основном копируются) при создании Pool. Это означает, что в вашем коде разветвленные потомки еще не выполнили создание f, а вместо этого ждут выполнения задач из основного процесса.

Прежде всего вы не должны выполнять «активный» код (кроме определения функций). , классы, константы) непосредственно в сценарии, но переместить его в функции. Ваш код может выглядеть так:

import numpy as np
import multiprocessing as mp


def f(x):
    return x**2

def g(x):
    return x + 1

def main():
    x = np.array([1,2,3,4,5,6])

    pool = mp.Pool(3)

    result = pool.map(f,x)
    result2 = pool.map(g,x)
    print('result=',result,'and result2=',result2)

# Should be nearly the only "active" statement
main()

Или, может быть, лучше в вашем случае, я думаю:

import numpy as np
import multiprocessing as mp


def f(x):
    return x**2

def g(x):
    return x + 1

def proc_f():
    global x, pool
    return pool.map(f,x)

def proc_g():
    global x, pool
    return pool.map(g,x)

def main():
    global x, pool
    x = np.array([1,2,3,4,5,6])

    pool = mp.Pool(3)

    result = proc_f()
    result2 = proc_g()
    print('result=',result,'and result2=',result2)

# Should be nearly the only "active" statement
main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...