【问题标题】:How to get the number of pending task in ioloop in tornado?如何在龙卷风的ioloop中获取待处理任务的数量?
【发布时间】:2019-08-29 04:12:42
【问题描述】:

我正在测试用于 websocket 客户端连接的网关服务器。我目前打开 10000 个客户端来连接并向我的网关服务器发送消息,它会回显所有消息。 当我键入'ctrl + c' 来停止进程时,需要很长时间才能停止,而且还有很多堆栈跟踪信息。所以我想计算循环中待处理任务的数量,并找到一个解决方案,在没有堆栈跟踪信息的情况下更快地停止 ioloop

我在https://www.tornadoweb.org/en/stable/ioloop.html找不到任何关于ioloop任务计数的api,所以我在这里问。

服务器端代码:

def create_application():
    return tornado.web.Application([(r'/', WebSocketHandler)])

if __name__ == '__main__':
    app = create_application()
    app.listen(60017)

客户端代码:

if __name__=='__main__':
    try:
        for i in range(1, 10000):
            wsc = WSClient('ws://127.0.0.1:60017', 'pname_' + str(i))
            wsc.start()
            ws_list.append(wsc)
            print('ws_client pname[%s] started!!!'%('pname_' + str(i)))
        tornado.ioloop.IOLoop.current().add_timeout(time.time() + 1, counting_packs)
        tornado.ioloop.IOLoop.current().start()

    except Exception as e:
        print(str(e))

我希望每秒计算待处理任务的数量... 如果有人能告诉我该怎么做,将不胜感激。非常感谢!!!

【问题讨论】:

    标签: tornado python-3.5 ioloop


    【解决方案1】:

    Tornado 目前不提供任何方法来确定有多少任务待处理。

    如果您只想在按下 ctrl-c 并尽快退出时抑制堆栈跟踪,可以运行signal.signal(signal.SIGINT, signal.SIG_DFL)。这也意味着您无法捕获KeyboardInterrupt 并从中恢复。

    【讨论】:

    • 还有一个小问题,我正在测试我的程序,它每秒从客户端接收大约 5000 个数据包,它每秒运行一个超时任务以打印出接收和发送了多少数据包。但是从输出中我可以看到这个任务一次运行不完全是一秒,通常延迟长达 2 秒。我不知道如何让它更准确......我已经使用更少的协程并尽可能少地阻止协程。有什么推荐吗?以下是一些示例输出:间隔为 1.9211 recv 包从 ws:5857 发送包到 ws:2766
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多