在Tornado Python框架中连续监视套接字

在Tornado Python框架中连续监视套接字,python,tornado,Python,Tornado,我正在使用Tornado,我想连续监视一个套接字以获取来自DB服务器的通知。到目前为止,我的应用程序如下所示: import functools import tornado import tornado.httpserver from tornado.ioloop import IOLoop class Application(tornado.web.Application): def __init__(self): handlers = [(r"/", MyHand

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

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()

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

您的回调必须调用
io\u循环。删除\u处理程序(fd)
。但是考虑将<代码> IoStult连接到文件描述符中,这是一个更方便、更高级的接口。您需要将回调附加到IOStream.read\u bytes:


如果您不知道预期的消息长度,请考虑传递
partial=True
streaming\u回调
,或者使用
read\u bytes
参数,或者
读取\u直到\u regex
如果您知道消息的结束时间。

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

Ok。这是否意味着为了在处理回调后监视它,我必须再次从回调调用add_handler吗?此外,我还将按照Ben的建议添加代码来使用数据。