在Tornado Python框架中连续监视套接字
我正在使用Tornado,我想连续监视一个套接字以获取来自DB服务器的通知。到目前为止,我的应用程序如下所示:在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
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的建议添加代码来使用数据。