Centos系统下载大全 | Redhat系统下载大全 | Windows2012系统下载大全 | Windows2008系统下载大全| CMS教程 | 网站地图 51运维网-专注Linux/Unix系统安全运维!
当前位置:51运维网 > 编程 > Python > 正文

基于python的Tornado Web Server来实现Comet

时间:2016-06-26 18:48 来源:网络整理 作者:linux系统 阅读:

一般的web应用,都会使用ajax轮询来获得服务器的更新。但轮询方式会增加服务器的压力,而且很多请求获得的数据并没有更新,这些请求都是无意义的,徒增服务器压力而已。

使用Comet技 术可以一定程度地解决以上问题。Comet的现很多,大多数需要使用特定的HTTP Server来实现。本文介绍使用基于pythonTornado Web Server来实现Server Side的Comet,为了贴近生产环境, 【51运维网】 ,还会介绍Tornado如何配合Nginx工作。

安装

到可以下载到最新的Tornado,那里也有安装的说明。

编写第一个Tornado程序

编辑comet.py,内容如下

#!/usr/bin/env python import tornado.httpserver import tornado.ioloop import tornado.web class MainHandler(tornado.web.RequestHandler): @tornado.web.asynchronous #说明1 def get(self): some_async_func(callback=self.wait) def wait(self, result): if result: self.write(result) self.finish() #说明2 else: tornado.ioloop.IOLoop.instance().add_timeout(time.time() + 0.5, lambda: some_async_func(callback=self.wait)) #说明3 application = tornado.web.Application([ (r"/", MainHandler), ]) if __name__ == "__main__": http_server = tornado.httpserver.HTTPServer(application) http_server.listen(8999) tornado.ioloop.IOLoop.instance().start() 说明1:使用此decorator即可以把get方法non-blocking化 说明2:non-blocking化的请求必须调用self.finish()完成请求 说明3:如果需要sleep等待,应该使用Tornado的IOLoop的add_timeout方法。使用其他休眠方法如time.sleep会block住当前线程, 【linux系统】 ,而Tornado是一个单线程Server,会导致其他请求无法执行的问题。

此时执行comet.py,一个non-blocking的server端已经搭建成功。

要注意的问题是,如果不加超时机制,服务端会不断执行,即使客户端已经断开。因此还需自己实现超时机制。

Nginx配置

upstream frontends { server 127.0.0.1:8999; } server { listen 8888; location / { proxy_read_timeout 1800; proxy_pass_header Server; proxy_set_header Host $http_host; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Scheme $scheme; proxy_pass ; } }

此配置采用proxy upstream到backend的原因是方便upstream负载均衡,只需要upstream中添加多几个ip端口即可。前面提过,Tornado是 单线程Server,启动cpu核数个Tornado进程并绑定到cpu,能够提高机器的吞吐量。

需要特别指出的是,要根据上述应用的超时机制, 【linux教程】 ,设置proxy_read_timeout,proxy_read_timeout必须大于应用的超时。否则将会有504请求返回。

至此,一个Comet应用的服务器端就完成了。由于Comet使用的是长连接机制,需要特别注意从客户端到真正后端程序之间每个环节的超时机制,而且网络连接的不可靠性影响将会更大,需要考虑更多边界条件。

参考资料:

  • 感谢您对【51运维网 http://www.51ou.com/】的支持,我们为您免费提供《基于python的Tornado Web Server来实现Comet》技术文章,《基于python的Tornado Web Server来实现Comet》详细使用和说明,有时《基于python的Tornado Web Server来实现Comet》可能不完善、敬请谅解!如果《基于python的Tornado Web Server来实现Comet》有错误请给我们留言,我们将尽快修复文章错误,如果您觉得本站不错,请分享给周围的朋友!谢谢!

    顶一下
    (0)
    0%
    踩一下
    (0)
    0%
    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    验证码:点击我更换图片