2016-05-04 130 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))