2016-05-04 13 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

あなたがしようとしていることの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)) 
関連する問題