Метод «starmap» не всегда возвращает значение при использовании многопроцессорного модуля из python - PullRequest
0 голосов
/ 05 июля 2019

Ниже у меня есть некоторый псевдокод для того, что должна делать моя программа, так как мой метод слишком длинный.Я пытаюсь использовать многопроцессорный модуль, чтобы ускорить время, необходимое для завершения «func1».Оба эти метода являются частью графического интерфейса, который я создаю с использованием PyQt5.Большую часть времени, когда я передаю параметры с помощью графического интерфейса «func2», никогда не возвращает вывод и продолжает работать.Самая странная часть заключается в том, что время от времени, когда я передаю одни и те же точные параметры, «func2» фактически работает, даже если я вообще не изменял код.

Дополнительная информация о проблеме

-Я работаю в Spyder

-Аргумент numpy_array имеет 30000 строк и 3 столбца.Мне нужен мой метод для работы с очень большими массивами.Другие аргументы очень маленькие списки.

-Я хочу, чтобы все процессы имели доступ к одному и тому же массиву.Также массив только для чтения.

Когда я запускал программу с помощью моего графического интерфейса, у меня был открыт диспетчер задач, и я заметил шаблон о том, когда «func2» будет работать, а когда - нет.

Когда я запускал свою программу и «func2» не прерывал, в диспетчере задач происходило следующее поведение.Два созданных процесса будут работать до тех пор, пока они не будут использовать около 27–30% ЦП и около 75–80 МБ памяти, а затем внезапно ЦП% для них обоих упадет до 0%, а используемая ими память уменьшится до 20–20%.40 МБ.Это повторяется бесконечно, и «func2» ничего не возвращает.

Когда «func2» работает, в диспетчере задач происходит следующее.Оба процесса работают до тех пор, пока они не потребляют 27–30% ЦП и 75–80 МБ.Процент CPU при этом остается неизменным для обоих процессов, но они продолжают потреблять больше памяти, пока не завершат работу, что составляет около 140-150 МБ.В этот момент «func2» возвращает список.

Мои основные вопросы следующие:

Почему многопроцессорная обработка не работает большую часть времени, но иногда работает, даже если я каждый раз запускаю один и тот же код с одинаковыми параметрами?

Есть ли способ, чтобы "func2" постоянно работал?

def func1(numpy_array, num1, num2, num3):
    #Reads from array and does computation 
    #It returns a number at the end
    returns number

def func2(numpy_array, num1_lst, num2_lst, lst):
    result = []
    for num3 in lst:
        arguments = list(itertools.product(*[[numpy_array], num1_lst, num2_lst, [num3]]))
        with multiprocessing.Pool(processes = 2) as p:
            output = p.starmap(func1, arguments)
        result.append(output)
    return result

Я не получаю никаких сообщений об ошибках, когда «func2» не запускается, но я вижу, как 2 процесса продолжают работать в диспетчере задач.Я хочу, чтобы многопроцессорная обработка дала вывод на каждой итерации цикла и добавила этот вывод в список.Тогда я хочу вернуть этот список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...