【发布时间】:2018-05-11 01:41:12
【问题描述】:
我有一个服务器运行一个从设备读取数据的循环,我想将它们发送给在龙卷风上连接到 websocket 的所有客户端。 我尝试将循环放在 open 函数中,但它无法处理 on_close 函数或新连接。
这样做的最佳做法是什么?
#!/usr/bin/env python
import tornado.httpserver
import tornado.websocket
import tornado.ioloop
import tornado.web
import socket
class MyWebSocketServer(tornado.websocket.WebSocketHandler):
def open(self):
print('new connection'+self.request.remote_ip)
try:
while True:
'''
read and send data
'''
except Exception,error:
print "Error on Main: "+str(error)
def on_close(self):
print('connection closed'+self.request.remote_ip)
application=tornado.web.Application([(r'/ws',MyWebSocketServer),])
if __name__=="__main__":
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(8000)
print('start')
tornado.ioloop.IOLoop.instance().start()
谢谢
【问题讨论】:
-
你不需要
while read,而是添加另一个函数on_message。查看官方文档:tornadoweb.org/en/stable/… -
我知道 on_message 函数,但是在 while 循环中我从设备读取数据,我需要通过 websocket 发送它们。
-
你如何在
while循环中读取数据?似乎该代码阻塞了服务器。 -
在 while 循环中,有一段代码可以从通过 USB 连接到串行 IC 的设备中连续读取数据。我需要 while 循环,因为我需要以大约 50Hz 的速率获取这些数据
-
@Miky 是的,
while循环内的代码阻塞了服务器,即当它开始运行时,没有其他东西可以运行。尝试使用ThreadPoolExecutor在单独的线程中运行while循环。
标签: python loops websocket tornado