2016-12-28 43 views
1

Ich habe die folgenden zwei Schnipsel, die die Macht der Threading zeigen und fragte mich, was der Unterschied für jede Implementierung ist.Python Threading/ThreadPool Implementierung

from multiprocessing.dummy import Pool as ThreadPool 

def threadInfiniteLoop(passedNumber): 
    while 1: 
     print passedNumber 

if __name__ == '__main__': 
    packedVals={ 
     'number':[0,1,2,3,4,5,6,7,8,9] 
    } 
    pool = ThreadPool(len(packedVals['number'])) 
    pool.map(func=threadInfiniteLoop,iterable=packedVals['number']) 

und

import threading 

def threadLoop(numberPassed): 
    while 1: 
     print numberPassed 

if __name__ == '__main__': 
    for number in range(10): 
     t = threading.Thread(target=threadLoop, args=(number,)) 
     t.start() 

Was ist der Unterschied zwischen den beiden Schnipsel und deren Initialisierung der von jedem Thread? Gibt es einen Vorteil gegenüber dem anderen und was wäre eine wünschenswerte Situation, in der die eine zutreffender wäre als die andere?

+0

Ich denke 'ThreadPool' ist viel lesbarer und Sie können immer sicher sein, dass Sie 9000 Threads nicht gestartet haben. –

Antwort

0

Es gibt keinen großen Unterschied, wenn Sie einen Thread starten möchten, der für immer läuft.

Normalerweise verwenden Sie einen Thread-Pool, wenn Ihr Programm ständig neue endliche Aufgaben erstellt, um "im Hintergrund" auszuführen (was auch immer das bedeutet).

Das Erstellen und Zerstören von Threads ist relativ teuer, so dass es sinnvoller ist, eine kleine Anzahl von Threads für eine lange Zeit zu verwenden und diese Threads dann immer wieder für die Hintergrundaufgaben zu verwenden. Das ist was ein Thread-Pool für Sie tut.

Es gibt normalerweise keinen Sinn in der Erstellung eines Threads Pool, wenn alles, was Sie wollen, ist ein einzelner Thread, der nie endet.

+0

Wie wäre es mit dem Fall, dass mehrere Threads unbegrenzt in einer While-Schleife laufen sollen? – George52098

+0

@ George52098, Wenn du nach einer unbestimmten Anzahl von Threads fragst, wo jeder Thread etwas Kleines macht und dann stirbt, dann sind diese kleinen Dinge, worüber ich gesprochen habe, als ich "Tasks" gesagt habe: Es ist besser zu benutzen Ein Thread-Pool, der diese Art von Arbeit erledigt, weil der Thread-Pool keinen neuen Thread für jede neue Aufgabe erstellen muss. Die Kosten für das Erstellen eines neuen Threads für jede neue Aufgabe können die Kosten für die tatsächliche Ausführung der Aufgaben erheblich übersteigen. –