在 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=True
或 streaming_callback
,或者使用带有 length
参数的 read_bytes
,或 read_until_regex
如果您知道消息何时结束。
只要有数据要读取,IOLoop
就会重复调用你的handler。您的回调必须消耗套接字中的所有数据才能使其再次空闲。
我正在使用 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=True
或 streaming_callback
,或者使用带有 length
参数的 read_bytes
,或 read_until_regex
如果您知道消息何时结束。
只要有数据要读取,IOLoop
就会重复调用你的handler。您的回调必须消耗套接字中的所有数据才能使其再次空闲。