Wie füge ich zwei separate Rückrufe zu einem Twisted Deferred hinzu, sodass beide ausgelöst werden, nachdem das Ergebnis vorliegt?

StackOverflow https://stackoverflow.com//questions/24051762

  •  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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top