twisted latente/Rückrufe und asynchronen Ausführung
Ich versuche, herauszufinden, wie kann ich meinen code mehr asynchrone twisted.
- Eine Funktion gibt ein deferred-Objekt
- dann füge ich eine Liste der Rückrufe
- die erste callback-wird aufgerufen, nachdem die latente Funktion liefert ein Ergebnis durch
deferred_obj.callback
- dann, in der Kette von Rückrufen, der erste Rückruf wird noch was mit den Daten und rufen Sie die zweite callback -
- und etc.
jedoch angekettet Rückrufe werden nicht als asynchrone, denn Sie sind angekettet und die Ereignis-Schleife wird feuern jeder von Ihnen gleichzeitig, bis es keine mehr, richtig?
Jedoch, wenn ich ein deferred-Objekt, und lege ich, wie seine Rückruf der deferred_obj.Rückruf als in d.addCallback(deferred_obj.callback)
dann wird dies als asynchron, weil die deferred_obj wartet auf die Daten, und dann die Methode, die übergeben wird, werden die Daten warten auf Daten als auch, jedoch sobald ich d....callback '- d' - Objekt verarbeitet die Daten dann rufen Sie deferred_obj.callback-aber da dieses Objekt ist zurückgestellt, im Gegensatz zu dem Fall gefesselt Rückrufe, es wird asynchron... richtig?
Vorausgesetzt, alle mein code ist nicht-blockierend, das bedeutet, dass verkettet Rückrufe sind NICHT asynchron, während gekettet deferreds sind, richtig?
- Bitte nehmen Sie sich diese und nutzen es in deinem wall of text:
...........
- was auch immer das bedeutet :/
- er meinte deine Frage ist sehr schwer zu Lesen, da es eine wall of text, so sollten Sie etwas mehr Platz...
- Er meinte interpunction im Allgemeinen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Rückrufe sind (standardmäßig) synchron. Jedoch, wie die Twisted-doc Punkte heraus:
So können Sie es verwenden, um einige der asynchronen Verarbeitung in Ihrer callback-Kette. Lassen Sie uns das tun:
Art, aber es gibt keine Parallelität in dieser Art von event processing. Keine neuen callback wird aufgerufen, bis der code wird wieder auf die Ereignis-Schleife. Also die Kette von Rückrufen ist synchron. Es ist nur asynchron in die event-Schleife.
Dies ist ein Nachteil dieser Art der Programmierung, die Handler die meisten schnell ausführen, und sich wieder auf die Ereignis-Schleife so schnell wie möglich. Es sollte nicht eine zeitraubende Aufgabe in einem handler.
Mit einer latenten macht nicht Ihr code asynchron.
Wenn Sie über längere Zeit mit synchronous code, können Sie deferToThread oder brechen Sie in kurzen Iterationen mit einer Mitarbeiterin (verdreht.internet.Aufgabe)
Wenn Sie möchten, um Ihren code mehr asynchron mit einem sauberen Ansatz dann schauen Sie sich dieses framework:
https://github.com/iogf/untwisted
Es hat ordentlich code mit verständlicher Dokumentation. Der Umgang mit asynchronen Modellen ist unkompliziert.