是否可以列出所有阻止的龙卷风协同程序

时间:2016-10-12 17:07:30

标签: python tornado

我在tornado中使用@tornado.gen.coroutine编写了一个“网关”应用程序,用于将信息从一个处理程序传输到另一个处理程序。我正在尝试进行一些调试/状态测试。我希望能够做的是列举在给定时刻生效的所有当前被阻止/等待的协同程序。这些信息是否可以在龙卷风的某个地方访问?

2 个答案:

答案 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_callbackhttp://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,您就可以获得更多所需。