在 Tornado Python 框架中持续监控套接字

Continuously monitor a socket in Tornado Python framework

我正在使用 Tornado,我想持续监视套接字以获取来自数据库服务器的通知。到目前为止,我的应用程序如下所示:

import functools
import tornado
import tornado.httpserver
from tornado.ioloop import IOLoop

class Application(tornado.web.Application):
    def __init__(self):
        handlers = [(r"/", MyHandler),]
        super(Application, self).__init__(handlers)
        fd = get_socket_file_descriptor()
        callback = functools.partial(self.my_callback)
        io_loop = IOLoop.current()
        io_loop.add_handler(fd, callback, io_loop.READ)

    def my_callback(self, fd, events):
        # do something
        pass

if __name__ == '__main__':
    http_server = tornado.httpserver.HTTPServer(Application())
    http_server.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

我的问题是,只要套接字上有 activity,就会无限调用回调。我希望 IOLoop 处理回调并返回监听文件描述符。

您的回调必须调用 io_loop.remove_handler(fd)。但是考虑将 IOStream 连接到文件描述符以获得更方便和更高级别的接口。您将回调附加到 IOStream.read_bytes:

http://tornado.readthedocs.org/en/latest/iostream.html#tornado.iostream.BaseIOStream.read_bytes

如果您不知道预期的消息长度,请考虑传递 partial=Truestreaming_callback,或者使用带有 length 参数的 read_bytes,或 read_until_regex 如果您知道消息何时结束。

只要有数据要读取,IOLoop就会重复调用你的handler。您的回调必须消耗套接字中的所有数据才能使其再次空闲。