导入使用MultiProcessing Python的模块

JMJ*_*MJR 7 python parallel-processing import matrix multiprocessing

我希望使用多处理模块来加快某些传输规划模型的运行时间.我通过"正常"方法尽可能地优化,但其核心是一个荒谬的并行问题.例如,执行相同的矩阵运算集,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
Run Code Online (Sandbox Code Playgroud)

所以我真正想做的就是在四核计算机上并行处理这个循环的迭代.我已经在这里以及多处理模块上的其他地方阅读了它,除了要求之外它似乎完全符合要求:

   if __name__ == '__main__'
Run Code Online (Sandbox Code Playgroud)

根据我的理解,这意味着您只能从脚本运行多处理代码?即如果我做了类似的事情:

    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()
Run Code Online (Sandbox Code Playgroud)

它运行正常,但假设我将上面保存为'matrix_multiproc.py',并定义了一个新文件'imported_test.py',它只是声明:

    import matrix_multiproc
Run Code Online (Sandbox Code Playgroud)

多处理不会发生,因为名称现在是'matrix_multiproc'而不是' main '

这是否意味着我永远不能在导入的模块上使用并行处理?我所要做的就是将我的模型运行为:

    def Model_Run():
        import Part1, Part2, Part3, matrix_multiproc, Part4

        Part1.Run()
        Part2.Run()
        Part3.Run()
        matrix_multiproc.Run()
        Part4.Run()
Run Code Online (Sandbox Code Playgroud)

很抱歉,这可能只是一个简单的答案,非常长的问题,谢谢!

Fer*_*yer 9

这是否意味着我永远不能在导入的模块上使用并行处理?

不,它没有.只要程序的主模块使用防护multiprocessing,您就可以在代码中的任何位置使用.if __name__ == '__main__'

在Unix系统上,你甚至不需要那个防护,因为它具有fork()从主python进程创建子进程的系统调用.

另一方面,在Windows上,通过使用不同的方法生成再次运行主模块的新进程来fork() 模拟.如果没有这里的警卫,你的主应用程序将尝试再次产生新的进程,导致无限循环,并且非常快地耗尽所有计算机的内存.multiprocessing__name__