Python namedtuple als Argument für apply_async (..) Callback

8

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.

%Vor%

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?

    
nbryans 24.01.2017, 14:54
quelle

2 Antworten

3

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:

%Vor%

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

    
Dag Høidahl 08.02.2017, 22:05
quelle
3

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.

%Vor%

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%     
gzc 24.01.2017 16:04
quelle