这两个简单的python代码有什么不同? (一个工作,另一个不工作)

时间:2017-08-08 12:07:05

标签: python numpy multiprocessing

public showFootNotes: boolean = false;

...

public toggleFootNotes() {
    this.showFootnotes = !this.showFootNotes;
}

上面的代码是一个简单的python代码,它使用多处理计算随机采样矩阵的逆。但是,以下代码不起作用

import os
import numpy as np
import time
from multiprocessing import Process, current_process


def doubler(number):
    result = number * 2
    proc_name = current_process().name
    print('{0} doubled to {1} by: {2}'.format( number, result, proc_name))

def solve_inverse(np_ndarray_square_matrix):
    inverse_matrix=np.linalg.inv(np_ndarray_square_matrix)
    proc_name = current_process().name
    print('process name :',proc_name,'       ',inverse_matrix)


if __name__=='__main__':
    start_time=time.time()

    dim=100
    thread_num=10

    matrice = [np.random.normal(loc=1.0 , scale=5.0 , size=(dim,dim)) for _ in range(thread_num)]
    procs = []

    for index, matrix in enumerate(matrice):
        proc = Process(target=solve_inverse , args=(matrix,))
        procs.append(proc)
        proc.start()

    for proc in procs:
        proc.join()

    end_time=time.time()

    print('time length :',end_time-start_time)

唯一的区别是是否有import os import numpy as np import time from multiprocessing import Process, current_process def doubler(number): result = number * 2 proc_name = current_process().name print('{0} doubled to {1} by: {2}'.format( number, result, proc_name)) def solve_inverse(np_ndarray_square_matrix): inverse_matrix=np.linalg.inv(np_ndarray_square_matrix) proc_name = current_process().name print('process name :',proc_name,' ',inverse_matrix) start_time=time.time() dim=3 thread_num=10 matrice = [np.random.normal(loc=1.0 , scale=5.0 , size=(dim,dim)) for _ in range(thread_num)] procs = [] for index, matrix in enumerate(matrice): proc = Process(target=solve_inverse , args=(matrix,)) procs.append(proc) proc.start() for proc in procs: proc.join() end_time=time.time() print('time length :',end_time-start_time) 。 据我所知,if __name__=='__main__:识别该模块是否由其他模块导入,或者该模块是否自行运行。所以我认为实际上两个代码之间没有区别来决定计算机应该做什么。什么错了?

2 个答案:

答案 0 :(得分:1)

多处理模块需要

if __name__ == '__main__':才能工作。请参阅Programming Guidelines,具体来说:

  

安全导入主模块

     

确保新的Python解释器可以安全地导入主模块,而不会导致意外的副作用(例如启动新进程)。

答案 1 :(得分:1)

具体来说,每次进行子进程时,该进程都会通过导入脚本开始(与import numpy as np一样)。

如果你没有阻止在if __name__='__main__':下生成新进程的脚本部分,那么所有这些子进程在导入脚本时都会产生自己的子进程,这将产生他们的拥有子子流程等等,直到你拥有。 。 。好 。 。 。

堆栈溢出。没有人喜欢他们。