Python + Tornado - 快速而干净的解决方案,用于转换PeriodicCallback()函数

时间:2015-03-07 15:48:04

标签: python multithreading tornado

据我了解,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 - 这个功能是阻塞的,我需要从并行执行的不同手机中获取图像)。我应该在方法(写...)上使用新的线程和信号量,这不是线程安全的吗?

0 个答案:

没有答案