2016-10-12 4 views
2

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

1

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.

+0

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

+0

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

2

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

+0

OK, das sieht vielversprechend aus. Nicht sicher, wie man die Ausgabe interpretiert, die ungefähr so ​​aussieht: {4: (4, .null_wrapper bei 0x7f6b6f53a400>), 6: (, .null_wrapper bei 0x7f6b6f53a620>), 7: (, .null_wrapper bei 0x7f6b6f53a730>), ... –

+0

ist die '

+0

@TravisGriggs, no .. Überprüfen Sie die aktualisierte Antwort – ndpu

Verwandte Themen