Один из способов сделать это (после исправления отступа sigma):
# -*- coding: utf-8 -*-
import multiprocessing as mp
def sigma(b):
n=0
for i in range (1,550):
n=n+i+b
return n
if __name__ == '__main__':
inputs_b = [1, 2, 3, 4]
with mp.Pool(processes = 2) as p:
res = p.map(sigma, inputs_b)
Единственная проблема с многопроцессорностью - это то, что вы не можете запустить ее в IDE (например, spyder), поэтому вам нужночтобы сохранить результаты и получить их позже.
Это можно сделать с помощью numpy
, pandas
, pickle
или др.
Тогда может потребоваться несколько аргументов.В этом случае используйте starmap()
:
# -*- coding: utf-8 -*-
import multiprocessing as mp
def sigma(a, b):
n=0
for i in range (1,550):
n=n+i+b+a
return n
if __name__ == '__main__':
inputs_b = [(a,b) for a in range(5) for b in range(6, 10)]
with mp.Pool(processes = 2) as p:
res = p.starmap(sigma, inputs_b)
Примечание: processes = N
дает число процессов, которые нужно открыть.Рекомендуется использовать количество физических процессоров или количество процессоров-1.
EDIT2: ваш фиктивный пример очень простой случай.У вас есть 2 варианта: написать свою функцию для выполнения элементарной задачи и распараллелить элементарные задачи ИЛИ заставить вашу большую функцию работать в течение 72 часов и запускать 4 или более одновременно на другом входе.
Вам также необходимоубедитесь, что процессы не используют общие ресурсы, иначе вам потребуется более сложная реализация.
Наконец, использование многопроцессорной обработки функций, генерирующих большое количество данных, может привести к ошибке памяти (недостаточно памяти).Это будет зависеть от приложения.