Ich schreibe ein kurzes Programm, in dem ich eine Funktion asynchron aufrufen möchte, damit sie den Anrufer nicht blockiert. Um dies zu tun, verwende ich Pool
aus Pythons multiprocessing
-Modul.
In der Funktion, die asynchron aufgerufen wird, möchte ich ein namedtuple
zurückgeben, um mit der Logik des Rests meines Programms übereinzustimmen, aber ich finde, dass ein namedtuple
kein unterstützter Typ zu sein scheint der erzeugte Prozess zum Callback (wahrscheinlich weil er nicht gebeizt werden kann). Hier ist eine minimale Wiederholung des Problems.
Weiß jemand, ob es einen Weg gibt, einen namedtuple
Rückgabewert vom asynchronen Prozess an den Callback zu übergeben? Gibt es einen besseren / mehr pythischen Ansatz für das, was ich mache?
Das Problem ist, dass der Fall für den Rückgabewert von namedtuple()
und dessen typename
-Parameter unterschiedlich ist. Das heißt, es gibt einen Konflikt zwischen der Klassendefinition des benannten Tupels und dem Variablennamen, den Sie ihm gegeben haben. Sie müssen die zwei übereinstimmen:
Und aktualisieren Sie die return
-Anweisung in doSomething()
entsprechend.
Vollständiger Code:
%Vor% (Um die Klassendefinition anzuzeigen, fügen Sie verbose=True
zu namedtuple()
hinzu.)
Der Grund, warum nichts gedruckt wird, ist, dass apply_async
im Hintergrund fehlgeschlagen ist. Übrigens denke ich, dass dies ein schlechtes Verhalten ist, das die Leute nur verwirrt. Sie können error_callback
übergeben, um Fehler zu behandeln.
Wenn Sie hierher gekommen sind, ist die Ausgabe
%Vor% Beißfehler! Sie haben Recht, namedtuple
kann nicht vom erzeugten Prozess an den Callback übergeben werden.
Vielleicht ist es kein auffälliger Weg, aber Sie können dict
als Ergebnis anstelle von namedtuple
senden.
Wie Dag Høidahl korrigiert hat, kann namedtuple weitergegeben werden. Die folgende Zeile funktioniert.
%Vor%Tags und Links python python-3.x python-2.7 python-multithreading