Импорт модулей, использующих многопроцессорный Python - PullRequest
7 голосов
/ 03 ноября 2011

Я хочу использовать многопроцессорный модуль для ускорения работы некоторых моделей планирования транспорта.Я оптимизировал столько, сколько смог, с помощью «нормальных» методов, но в основе этого лежит нелепо параллельная проблема.Например, выполнить один и тот же набор матричных операций с четырьмя 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 Ответ

9 голосов
/ 03 ноября 2011

Означает ли это, что я никогда не смогу использовать параллельную обработку в импортированном модуле?

Нет, это не так. Вы можете использовать multiprocessing в любом месте своего кода, при условии , что основной модуль программы использует if __name__ == '__main__' guard.

В системах Unix вам даже не понадобится этот сторож, поскольку он использует системный вызов fork() для создания дочерних процессов из основного python процесса.

В Windows, с другой стороны, fork() эмулируется multiprocessing, порождая новый процесс, который снова запускает основной модуль , используя другой __name__. Без этой меры ваше основное приложение будет пытаться порождать новые процессы снова, что приведет к бесконечному циклу и довольно быстро поглотит всю память вашего компьютера.

...