2016-05-04 11 views
0

Ich versuche, den Unterschied in der Zeit der Ausführung zu finden, wie ich die Anzahl der Threads erhöhen. Im Grunde möchte ich herausfinden, wie lange die äußere Schleife benötigt, um nach Abschluss der Jobs in allen Threads in dieser Schleife ausgeführt zu werden.Finde die Ausführungszeit nach der Ausführung mit N Threads

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)) 

Dies ist ein einfaches Programm, um den Job zu gleichen Teilen zwischen Threads aufgeteilt, wo n_threads ist die Anzahl der threads.I die Ausführungszeit, wenn n_threads finden will = 1,2 .... 10. In meinem gegenwärtigen Code glaube ich jedoch nicht, dass ich die Zeit bekomme, nachdem alle Threads ausgeführt wurden, sondern die Zeit wird parallel gegeben, während der Rest der Threads ausgeführt wird. Wie behebe ich das?

+1

Ein Problem mit dem, was Sie versuchen, ist Python hat eine globale Interpreter-Sperre (GIL). Was das im Grunde bedeutet, ist, dass Ihr Programm tatsächlich nur die Threads verschachtelt und keine echte Nebenläufigkeit ausführt. Sie werden keine Beschleunigung erleben. Sie können stattdessen versuchen, die Multiprocessing-Bibliothek zu verwenden. – Strikeskids

+0

Gibt es noch eine Möglichkeit, den Zeitpunkt zu finden, an dem eine Gruppe von Threads in einer Iteration ihre Ausführung beendet hat? – Muhammad

Antwort

0

Sie haben Recht, dass Sie nicht die Zeit bekommen, die für die Fertigstellung aller Threads benötigt wird. Sie müssen jeden Thread an eine Liste anhängen. Rufen Sie dann die Join-Methode auf, um darauf zu warten, dass der Thread seine Arbeit beendet. Beachten Sie auch den Kommentar von 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))