1

ich Probleme, bin Rückgabewert aus einem Unterprogramm Extrahieren ich aus einem Thread lief, in Python 3.Wie einen Rückgabewert aus einem Unterprogramm läuft in einem Thread zu bekommen

import threading 
from threading import Thread 
def dothis(): 
    x = 17 
    return x 

Thread(target = dothis).start() 

print(x) 

Das gibt mir nur ein Fehler und sagt, dass x nicht definiert ist, aber ich habe es von meinem Unterprogramm zurückgegeben. Kann mir jemand in die richtige Richtung zeigen?

+0

Ein Problem ist, dass Sie den Rückgabewert überhaupt nicht sammeln. Auch ohne Threading müssten Sie den zurückgegebenen Wert x zuweisen, damit x einen Wert hat, weil x nur im Bereich der dothis-Funktion existiert. Da Sie einen anderen Thread gestartet haben, können Sie nicht wissen, ob die Ausführung abgeschlossen ist, bevor print (x) ausgeführt wird, weil Sie nicht mit dem neuen Thread synchronisiert haben. – poompt

+0

Sie sollten wahrscheinlich eine Warteschlange verwenden - siehe z. [diese Antwort] (https://stackoverflow.com/a/36926134/984421) auf die verknüpfte dup-Frage. – ekhumoro

Antwort

0

x ist eine lokale Variable. Es existiert nur im Rahmen der dothis Funktion.

Wenn Sie möchten, dass es außerhalb der Funktion zugänglich ist, müssen Sie es zu einer globalen Variablen machen.

x = 0 

def dothis(): 
    global x 
    x = 17 

jedoch globale Variablen (nicht Konstanten) sind in der Regel ein Zeichen für schlechtes Code-Design und sollen, insbesondere mit Fäden vermieden werden, da Sie Rennbedingungen auftreten können, wenn mehrere Threads versuchen werden, um die gleiche globale Variable zu ändern .

0

Es scheint, dass Sie Inputs für eine Funktion geben, eine Anzahl von Threads gleichzeitig ausführen und die Ausgabewerte abrufen möchten. Etwas wie folgt aus:

import multiprocessing 

def dothis(x): 
    print x 
    #More Code 
    return x 

if __name__ == '__main__': 
    multiprocessing.freeze_support() 
    InputsList = [1,2,3,4] 
    Processors = 4 
    pool = multiprocessing.Pool(Processors) 
    Results = pool.map(dothis, InputsList) 
    print Results 

Wie bereits erwähnt, in Ihrem Code x nicht außerhalb der Funktion definiert worden ist, das ist, warum Sie diesen Fehler erhalten. Die Eingaben müssen in Ihrer Hauptfunktion oder als globale Variablen definiert sein.

Sie können eine Liste von Eingaben an die gewünschte Funktion übergeben und Results enthält eine Liste der zurückgegebenen Werte.

Verwandte Themen