Импорт модулей, использующих многопроцессорный Python

#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.