簡體   English   中英

這兩個簡單的python代碼有什么區別? (一個有效,另一個無效)

[英]what's different between these two simple python codes? (one works and the other doesn't work)

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代碼,可通過多重處理來計算隨機采樣矩陣的逆。 但是,以下代碼不起作用

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__:識別此模塊是由另一個模塊導入的,還是該模塊本身運行的。 因此,我認為確定兩個計算機應該做什么之間實際上沒有什么區別。 怎么了?

if __name__ == '__main__':多處理模塊需要工作。 請參閱編程指南 ,特別是:

安全導入主模塊

確保可以由新的Python解釋器安全地導入主模塊,而不會引起意外的副作用(例如,啟動新進程)。

具體來說,每次創建子進程時,該進程都會從導入腳本開始(就像您import numpy as np )。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM