2017-08-14 6 views
1

Der folgende Code beginnt ein paar Fäden und druckt das Ergebnis, nachdem sie alles getan werden:Wie erhalten Sie Ergebnisse von Threads, wenn sie abgeschlossen sind?

import threading 

results = [None] * 5 
threads = [None] * 5 

def worker(i): 
    results[i] = i 

for i in range(5): 
    threads[i] = threading.Thread(target=worker, args=(i,)) 
    threads[i].start() 

# here I would like to use the results of the threads which are finished 
# while others still run 

for i in range(5): 
    threads[i].join() 

# here I have the results but only when all threads are done 
print(results) 

Wie im Code erwähnt, würde Ich mag die Ergebnisse der Fäden verwenden, die fertig sind, während andere noch laufen . Was ist der richtige Weg?

Soll ich einfach einen neuen Thread beginnen, die eine while True: Schleife haben würde und prüfen kontinuierlich für einen neuen Eintrag in results oder gibt es einen buil-Mechanismus für solche Operationen (als Teil des threading.Thread Anruf, der zu einem Punkt würde Rückruf wenn der Thread fertig ist)?

+0

'von multiprocessing.pool Import ThreadPool' und Sie es von dort zu nehmen. –

+0

Könnten Sie das aufzählen? –

+0

'https://StackOverflow.com/Questions/6893968/How-to-get-the-return-value-from-a-thread-in-python' möglicherweise Ihre Antwort ist hier – Kallz

Antwort

1

Da Sie mit Python sind 3, concurrent.futures ist eine bessere Passform als threading:

import concurrent.futures 

results = [None] * 5 

def worker(i): 
    results[i] = i 

with concurrent.futures.ThreadPoolExecutor(5) as pool: 
    futmap = {pool.submit(worker, i): i for i in range(len(results))} 
    for fut in concurrent.futures.as_completed(futmap): 
     print("doing more stuff with", futmap[fut]) 
+0

* Das Modul concurrent.futures bietet eine High-Level-Schnittstelle für die asynchrone Ausführung von callables * - ausgezeichnet, das ist genau das, wonach ich gesucht habe, danke! – WoJ

Verwandte Themen