Ich habe eine "Gateway" -App in tornado
mit @tornado.gen.coroutine
geschrieben, um Informationen von einem Handler zum anderen zu übertragen. Ich versuche, einige Debugging/Status-Tests zu machen. Was ich gerne tun könnte, ist, alle aktuell blockierten/wartenden Coroutinen aufzulisten, die zu einem bestimmten Zeitpunkt live sind. Ist diese Information irgendwo im Tornado zugänglich?ist es möglich, alle blockierten Tornado-Korutinen aufzulisten
Antwort
Nein, es ist nicht, aber man könnte vielleicht Ihre eigenen Dekorateur erstellen, die gen.coroutine Wraps, aktualisiert dann eine Datenstruktur, wenn die Koroutine beginnt.
import weakref
import functools
from tornado import gen
from tornado.ioloop import IOLoop
all_coroutines = weakref.WeakKeyDictionary()
def tracked_coroutine(fn):
coro = gen.coroutine(fn)
@functools.wraps(coro)
def start(*args, **kwargs):
future = coro(*args, **kwargs)
all_coroutines[future] = str(fn)
return future
return start
@tracked_coroutine
def five_second_coroutine():
yield gen.sleep(5)
@tracked_coroutine
def ten_second_coroutine():
yield gen.sleep(10)
@gen.coroutine
def tracker():
while True:
running = list(all_coroutines.values())
print(running)
yield gen.sleep(1)
loop = IOLoop.current()
loop.spawn_callback(tracker)
loop.spawn_callback(five_second_coroutine)
loop.spawn_callback(ten_second_coroutine)
loop.start()
Wenn Sie dieses Skript für ein paar Sekunden laufen werden Sie zwei aktive Koroutinen sehen, dann eine, dann keine.
Beachten Sie die warning in the docs about the dictionary changing size, sollten Sie "RuntimeError" in "Tracker" abfangen, um mit diesem Problem umzugehen.
Dies ist ein bisschen komplex, Sie könnten alles, was Sie brauchen, viel einfacher erhalten, indem Sie die Protokollierung von Tornado aktivieren und set_blocking_log_threshold verwenden.
Sie sprechen über Ioloop _handlers
dict vielleicht. Versuchen Sie, diese in regelmäßigen Rückruf hinzuzufügen:
def print_current_handlers():
io_loop = ioloop.IOLoop.current()
print io_loop._handlers
Update: Ich Quellcode überprüft haben und jetzt denken, dass es keine einfache Möglichkeit, verfolgen laufenden gen.corouitines, A. Jesse Jiryu Davis ist richtig!
Aber Sie können alle „async“ Anrufe (Erträge) aus Koroutinen Spuren - jede Ausbeute von Generator gehen in IOLoop.add_callback
(http://www.tornadoweb.org/en/stable/ioloop.html#callbacks-and-timeouts)
also durch io_loop._callbacks
Prüfung können Sie sehen, was jetzt Ausbeuten sind in ioloop.
Viele interessante Sachen hier :) https://github.com/tornadoweb/tornado/blob/master/tornado/gen.py
OK, das sieht vielversprechend aus. Nicht sicher, wie man die Ausgabe interpretiert, die ungefähr so aussieht: {4: (4,
ist die '
@TravisGriggs, no .. Überprüfen Sie die aktualisierte Antwort – ndpu
- 1. Ist es möglich, alle Fremdschlüssel in einer Datenbank aufzulisten?
- 2. Ist es möglich, alle Funktionen einer Tabelle aufzulisten?
- 3. Ist es möglich, alle globalen Variablen in PHP aufzulisten?
- 4. Ist es möglich, Lasten aufgrund von möglichen Aliasing-Verstößen aufzulisten?
- 5. Ist es möglich, Variablennamen einer Struktur in objective-c aufzulisten?
- 6. Ist es möglich, alle derzeit in der Anwendung befindlichen RemoteIO-Audiogeräte aufzulisten?
- 7. Ist es möglich, alle Methoden und Eigenschaften aufzulisten, die über Invoke() eines [ADSI] -Objekts verfügbar sind?
- 8. Ist es möglich, alle Third-Level-Domains der angegebenen Second-Level-Domain aufzulisten?
- 9. Ist es möglich, alle Ereignisse in einem Prozess aufzulisten? Linux-Betriebssystem
- 10. Möglich, alle PHP-Klassen und ihre Methoden und Eigenschaften aufzulisten?
- 11. Ist es möglich, alle Funktionen zu verschachteln?
- 12. Prolog: Gibt es einen Befehl, um alle eingebauten Prädikate aufzulisten?
- 13. Ist es möglich, Open Source-Bibliotheken und ihre Lizenzen automatisch aufzulisten?
- 14. Gibt es eine Möglichkeit, alle Größenabhängigkeiten programmatisch aufzulisten?
- 15. Gibt es eine API, um alle Azure-Regionen aufzulisten?
- 16. Ist es möglich, Werte aus einem Datenrahmen aufzulisten, der nicht zusammengeführt werden konnte?
- 17. Wie alle Tabellen aufzulisten oder nur
- 18. ist es möglich,
- 19. Ist es möglich, die erlaubten Werte eines SimpleSchema-Schemas im Client mithilfe von Meteoren aufzulisten?
- 20. Ist es möglich, Dateien aus dem Cache-Verzeichnis einer anderen App aufzulisten?
- 21. Ist es möglich, die Zellen aufzulisten, die Werte in Excel enthalten?
- 22. Killing einen blockierten UDP-Socket
- 23. Aufruf GetCategories ebay API, um alle aufzulisten
- 24. Aufrufmethode blockierten Thread
- 25. Es wird versucht, alle Benutzernamen aufzulisten, wenn kein userName-Wert angegeben ist.
- 26. ASP.NET: Ist es möglich, alle Session-Objekte zu durchlaufen?
- 27. Ist es möglich, alle aktiven jQuery bind() zu zeigen?
- 28. Ist es möglich, alle aktiven Abonnements zu sehen
- 29. Ist es möglich, in alle Ordner zu navigieren?
- 30. Ist es möglich, dass alle Module implizit ein Modul importieren?
Ich bin interessiert an der 'set_blocking_log_threshold()' Ansatz. Also habe ich eine 'tornado.ioloop.IOLoop.instance() .set_blocking_log_threshold (1)' direkt vor meine '... current(). Start()' Zeile gesetzt. Ich habe eine GET-Anfrage, die ich sagen kann, ist als Coroutine blockiert (es hat noch nicht geantwortet), aber ich sehe nichts in einem Protokoll. Ich führe das als ein Systemskript aus, wo * sollte * ich nach der Protokollausgabe suchen? Das doc hört sich so an, als würde das nur passieren, wenn der Haupt-Thread zu lange blockiert. Nicht wenn ein Handler als Coroutine gesperrt ist. Wird das zeigen, was ich will? –
Es wird nur angezeigt, wenn synchroner Code die Ereignisschleife blockiert. Wenn Sie Ihrem Code einen time.sleep (10) hinzufügen, sollten Sie sehen, dass er in Ihrem Tornado-Anwendungsprotokoll angezeigt wird. Wenn (ohne time.sleep) keine blockierenden Operationen protokolliert wurden, dann wird Ihr Code korrekt geschrieben - er ist asynchron - also könnte mein komplexer Ansatz das tun, was Sie wollen. –