#python #import #matrix #parallel-processing #multiprocessing
#python #импорт #матрица #параллельная обработка #многопроцессорная обработка
Вопрос:
Я хочу использовать многопроцессорный модуль для ускорения времени выполнения некоторых моделей транспортного планирования. Я оптимизировал столько, сколько мог, с помощью «обычных» методов, но в основе этого лежит абсурдно параллельная проблема. Например, выполните один и тот же набор матричных операций с четырьмя 4 различными наборами входных данных, все независимые данные.
Псевдокод:
for mat1,mat2,mat3,mat4 in zip([a1,a2,a3,a4],[b1,b2,b3,b4],[c1,c2,c3,c4],[d1,d2,d3,d4]):
result1 = mat1*mat2^mat3
result2 = mat1/mat4
result3 = mat3.T*mat2.T mat4
Итак, все, что я действительно хочу сделать, это обработать итерации этого цикла параллельно на четырехъядерном компьютере. Я прочитал здесь и в других местах о многопроцессорном модуле, и, похоже, он идеально подходит, за исключением требуемого:
if __name__ == '__main__'
Насколько я понимаю, это означает, что вы можете запускать только многопроцессорный код из скрипта? т.е. если я сделаю что-то вроде:
import multiprocessing
from numpy.random import randn
a = randn(100,100)
b = randn(100,100)
c = randn(100,100)
d = randn(100,100)
def process_matrix(mat):
return mat^2
if __name__=='__main__':
print "Multiprocessing"
jobs=[]
for input_matrix in [a,b,c,d]:
p = multiprocessing.Process(target=process_matrix,args=(input_matrix,))
jobs.append(p)
p.start()
Он работает нормально, однако при условии, что я сохранил вышеуказанное как ‘matrix_multiproc.py ‘, и определил новый файл’importing_test.py » в котором просто говорится:
import matrix_multiproc
Многопроцессорная обработка не выполняется, потому что имя теперь ‘matrix_multiproc’, а не ‘main‘
Означает ли это, что я никогда не смогу использовать параллельную обработку в импортированном модуле? Все, что я пытаюсь сделать, это запустить мою модель как:
def Model_Run():
import Part1, Part2, Part3, matrix_multiproc, Part4
Part1.Run()
Part2.Run()
Part3.Run()
matrix_multiproc.Run()
Part4.Run()
Извините за очень длинный вопрос, на который, вероятно, простой ответ, спасибо!
Ответ №1:
Означает ли это, что я никогда не смогу использовать параллельную обработку в импортированном модуле?
Нет, это не так. Вы можете использовать multiprocessing
в любом месте своего кода, при условии, что основной модуль программы использует if __name__ == '__main__'
защиту.
В системах Unix вам даже не понадобится эта защита, поскольку она включает fork()
системный вызов для создания дочерних процессов из основного python
процесса.
В Windows, с другой стороны, fork()
эмулируется multiprocessing
путем создания нового процесса, который снова запускает основной модуль, используя другой __name__
. Без защиты здесь ваше основное приложение снова попытается запустить новые процессы, что приведет к бесконечному циклу и довольно быстро съест всю память вашего компьютера.
Комментарии:
1. Означает ли это, что я не должен видеть большое старое предупреждение в системах Unix? Или все еще есть ложное предупреждение? Я вижу это в OSX.