据我了解,Tornado是单线程的,并且同步执行每个请求,即使它异步处理它们(仍然在那个位置上混淆)。
class WebSocketHandler(tornado.websocket.WebSocketHandler):
def check_origin(self, origin):
return True
def open(self):
print 'new connection'
def on_message(self, message):
#do something
...
#periodically call function to get image and send it to client
self.callback = PeriodicCallback(self.get_image_screencap, 800)
self.callback.start()
def get_image_screencap(self):
#take image
...
#send it to client
self.write_message(self.str_img)
def on_close(self):
self.callback.stop()
print 'connection closed'
application = tornado.web.Application([
(r'/', WebSocketHandler),
])
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(8080)
main_loop = tornado.ioloop.IOLoop.instance()
main_loop.start()
2.clients加入服务器后的结果
1.客户接收图片
2.客户接收图片
1.客户接收图片
2.客户接收图片
第一个回调取决于另一个回调等...
最佳解决方案是什么?对于所有客户端,我需要独立的功能(get_image_screencap - 这个功能是阻塞的,我需要从并行执行的不同手机中获取图像)。我应该在方法(写...)上使用新的线程和信号量,这不是线程安全的吗?