2017-08-08 77 views
-1
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) 

上面的代碼是一個簡單的python代碼,它用多處理計算隨機採樣矩陣的逆。但是,下面的代碼不起作用這兩個簡單的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) 


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__:與否。 據我所知,if __name__=='__main__:認識到,如果這個模塊是由其他模塊導入或該模塊自己運行。所以我認爲實際上兩個代碼之間沒有區別來決定計算機應該做什麼。怎麼了?

+0

還有一個問題!看起來第一個代碼並不是'多處理',我的意思是,當我觀察代碼從開始到結束的時間時,多處理似乎不能同時工作。當我增加多處理數量時,時間線性增加w.r.t.多處理的數量。我不知道發生了什麼!請幫幫我! – Eric

+1

這些答案將有所幫助。 https://stackoverflow.com/a/29697273/4045933, https://stackoverflow.com/a/18205006/4045933 – SunilT

回答

1

具體而言,您每次創建子進程時,該進程都會通過導入腳本來啓動(與您的可能import numpy as np一樣)。

如果您沒有阻止生成if __name__='__main__':下的新進程的腳本部分,則所有這些子進程都會在導入腳本時產生自己的子子進程,這會生成自己的子進程,子子過程等等,直到你擁有。 。 。好 。 。 。

堆棧溢出。沒有人喜歡他們。

1

if __name__ == '__main__':是多處理模塊工作所必需的。見Programming Guidelines,具體有:

主要模塊的安全進口

確保主模塊可以通過一個新的Python解釋器可以安全地進口,而不會導致意想不到的副作用(例如一開始一個新的進程)。

相關問題