我在tornado
中使用@tornado.gen.coroutine
编写了一个“网关”应用程序,用于将信息从一个处理程序传输到另一个处理程序。我正在尝试进行一些调试/状态测试。我希望能够做的是列举在给定时刻生效的所有当前被阻止/等待的协同程序。这些信息是否可以在龙卷风的某个地方访问?
答案 0 :(得分:2)
你可能会谈论ioloop _handlers
字典。尝试在定期回调中添加它:
def print_current_handlers():
io_loop = ioloop.IOLoop.current()
print io_loop._handlers
更新:我已检查过源代码,现在认为没有简单的方法可以追踪当前正在运行的gen.corouitines,A。Jesse Jiryu Davis是对的!
但你可以从协同程序追踪所有“异步”调用(产量) - 来自生成器的每个产量都进入IOLoop.add_callback
(http://www.tornadoweb.org/en/stable/ioloop.html#callbacks-and-timeouts)
因此,通过检查io_loop._callbacks
,您可以看到ioloop目前的收益率。
许多有趣的东西在这里:) https://github.com/tornadoweb/tornado/blob/master/tornado/gen.py
答案 1 :(得分:1)
没有没有,但你可以创建自己的包装gen.coroutine的装饰器,然后在协程开始时更新数据结构。
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()
如果你运行这个脚本几秒钟,你会看到两个活动的协同程序,然后是一个,然后是没有。
注意warning in the docs about the dictionary changing size,您应该在“跟踪器”中捕获“RuntimeError”来处理该问题。
这有点复杂,只需打开Tornado的日志记录并使用set_blocking_log_threshold,您就可以获得更多所需。