Wie füge ich zwei separate Rückrufe zu einem Twisted Deferred hinzu, sodass beide ausgelöst werden, nachdem das Ergebnis vorliegt?
-
21-12-2019 - |
Frage
Ich habe nicht viel Erfahrung mit Twisted, aber hier ist, was ich bisher verstanden habe.
Wenn ich eine Datenbankabfrage durchführe, z. B.:
db = database.veryLongQuery(sql, binds)
Ich kann Rückrufe hinzufügen, um etwas mit dem Ergebnis zu tun.
db.addCallback(lambda res: dispalyResult(res))
Andernfalls könnte ich eine Methode erstellen, wenn ich mehrere Dinge mit demselben Ergebnis tun muss:
def doTwoThings(self, res):
self.d1 = anotherDeferred(res) # write to table A, return lastRowId
self.d2 = yetAnotherDeferred(res) # write to table B, return lastRowId
return d1
und hängen Sie das an db
(als erster Rückruf)
db.addCallback(self.doTwoThings)
Allerdings hätte ich gerne einen Hinweis darauf d1
Und d2
von Anfang an, gleichzeitig mit der Erstellung der Datenbank, da andere Ereignisse stattfinden und ich Rückrufe hinzufügen muss d1
Und d2
.
Wie würde ich vorgehen, wenn ich zwei (oder mehr) separate Rückrufketten an denselben verzögerten Rückruf anhängen würde? db
, also „spaltet“ es sich und beide werden nebeneinander abgefeuert, sobald das Ergebnis vorliegt?
Auf diese Weise kann ich von Anfang an den Überblick über alle zurückgestellten Aufgaben behalten und bei Bedarf darauf zugreifen.
Oder gibt es eine Möglichkeit, etwas zu erstellen? d1
Und d2
von Anfang an, also habe ich Zugriff auf diese Namen?
Lösung
Sie können so etwas verwenden:
def splitResults(d1, d2):
def splitter(val):
# Pass val to d2 chain
d2.callback(val)
# Return val into d1's chain
return val
def splitterError(err):
d2.errback(err)
d1.addCallbacks(splitter, splitterError)
Wenn also d1 ein Ergebnis erhält, wird es dieses auch an d2 weitergeben.