无限循环无法连接到websocket服务器
客户端连接websocket并调用tail_log方法,而新客户端无法连接 如何解决这个问题无限循环无法连接到websocket服务器,websocket,tornado,Websocket,Tornado,客户端连接websocket并调用tail_log方法,而新客户端无法连接 如何解决这个问题 def on_message(self, message): def tail_log(user,ip,port,cmd,log_path,url): cmd = "/usr/bin/ssh -p {port} {user}@{ipaddr} {command} {logpath}" \ .format(user=user, ipaddr=ip, por
def on_message(self, message):
def tail_log(user,ip,port,cmd,log_path,url):
cmd = "/usr/bin/ssh -p {port} {user}@{ipaddr} {command} {logpath}" \
.format(user=user, ipaddr=ip, port=port, command=cmd, logpath=log_path)
f = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
while True:
line = f.stdout.readline().strip()
if line == '':
self.write_message('failed')
break
self.write_message(line)
tail_log(user=SSH_USER,ip=IP_ADDR,cmd=CMD,port=SSH_PORT,log_path=LOG_PATH,url=SOCKET_URL)
您的无限循环必须通过执行
yield
、wait
,或通过从tail\u log
函数返回,将控制权交还给Tornado的事件循环。由于无限循环不会将控制权交给事件循环,因此事件循环永远无法处理更多的事件,包括新的websocket连接
尝试使用异步读取子进程的标准输出。大概是这样的:
import tornado.ioloop
import tornado.process
import tornado.web
import tornado.websocket
class TailHandler(tornado.websocket.WebSocketHandler):
def open(self):
self.write_message(u"Tailing....")
self.p = tornado.process.Subprocess(
"tail -f log.log",
stdout=tornado.process.Subprocess.STREAM,
stderr=tornado.process.Subprocess.STREAM,
shell=True)
tornado.ioloop.IOLoop.current().add_callback(
lambda: self.tail(self.p.stdout))
tornado.ioloop.IOLoop.current().add_callback(
lambda: self.tail(self.p.stderr))
self.p.set_exit_callback(self.close)
async def tail(self, stream):
try:
while True:
line = await stream.read_until(b'\n')
if line:
self.write_message(line.decode('utf-8'))
else:
# "tail" exited.
return
except tornado.iostream.StreamClosedError:
# Subprocess killed.
pass
finally:
self.close()
def on_close(self):
# Client disconnected, kill the subprocess.
self.p.proc.kill()
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("""<html><head><script>
var ws = new WebSocket("ws://localhost:8888/tail");
ws.onmessage = function (evt) {
document.write('<p>' + evt.data + '</p>');
};</script></head></html>""")
def make_app():
return tornado.web.Application([
(r"/", MainHandler),
(r"/tail", TailHandler),
])
app = make_app()
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
导入tornado.ioloop
导入tornado.process
导入tornado.web
导入tornado.websocket
类TailHandler(tornado.websocket.WebSocketHandler):
def打开(自):
自述信息(u“跟踪…”)
self.p=tornado.process.Subprocess(
“tail-f log.log”,
stdout=tornado.process.Subprocess.STREAM,
stderr=tornado.process.Subprocess.STREAM,
shell=True)
tornado.ioloop.ioloop.current().add\u回调(
lambda:self.tail(self.p.stdout))
tornado.ioloop.ioloop.current().add\u回调(
lambda:self.tail(self.p.stderr))
self.p.set\u exit\u回调(self.close)
异步定义尾部(自、流):
尝试:
尽管如此:
line=等待流。在(b'\n'之前读取\u)
如果行:
自写消息(行解码('utf-8'))
其他:
#“尾巴”退出了。
返回
除tornado.iostream.StreamClosedError外:
#子进程被终止。
通过
最后:
self.close()
def on_关闭(自身):
#客户端已断开连接,请终止子进程。
self.p.proc.kill()
类MainHandler(tornado.web.RequestHandler):
def get(自我):
self.write(“”)
var ws=newwebsocket(“ws://localhost:8888/tail”);
ws.onmessage=函数(evt){
document.write(''+evt.data+'');
};""")
def make_app():
return tornado.web.Application([
(r“/”,主处理器),
(r“/尾”,尾处理装置),
])
app=make_app()
app.listen(8888)
tornado.ioloop.ioloop.current().start()
如果您还没有使用Python 3.5,请将@gen.coroutine替换为“async def”,将“yield”替换为“wait”,并将“break”替换为“return”。谢谢,在我的代码中,实现在on message模块中,因为我的查询服务器内容是从客户端上传信息来确定的