2016-05-04 140 views
0

我試圖在不斷增加線程數的情況下發現執行時間的差異。基本上,我想知道在完成循環中所有線程中的作業之後外循環需要執行多長時間。使用N個線程執行後查找執行時間

import threading 
import time 
from math import sqrt 


def run(start, end): 
    [sqrt(i) for i in range(start,end)] 

n_threads = 2 
n_vals = 1000000 
start_time = time.time() 
for n_threads in range(1,11): 
    start_time = time.time() 
    for i in range(0,n_threads): 
     first = int((n_vals/n_threads)*i) 
     last = int((n_vals/n_threads)*(i+1)) 
     t=threading.Thread(target=run, args=(first,last)) 
     t.start() 
    print("For Threads = "+ str(n_threads) +" --- %s seconds ---" % (time.time() - start_time)) 

這是一個簡單的程序來線程其中n_threads是threads.I的數量要查找的執行時間時n_threads = 1,2 .... 10之間平分該作業。然而,在我現在的代碼中,我並不認爲我在所有線程執行完後都會得到時間,而是在剩下的線程正在執行時並行地給出時間。我該如何解決?

+1

你試圖做的一個問題是Python有一個全局解釋器鎖(GIL)。這基本上意味着你的程序實際上只交錯線程,而不是做真正的併發。你不會遇到任何加速。如果需要,您可以嘗試使用多處理庫。 – Strikeskids

+0

還有一種方法可以找到迭代中的一組線程完成執行的時間嗎? – Muhammad

回答

0

你是正確的,你沒有得到所有線程完成所需的時間。您需要將每個線程追加到列表中。然後調用join方法等待該線程完成其工作。另外,請注意Strikeskid的評論。

start_time = time.time() 
threads = [] 
for i in range(0,n_threads): 
    t=threading.Thread(target=run, args=(first,last)) 
    threads.append(t) 
    t.start() 

# Wait for all threads to complete 
for t in threads: 
    t.join() 
print("For Threads = "+ str(n_threads) +" --- %s seconds ---" % (time.time() - start_time))