|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
如果您觉得本篇CentOSLinux教程讲得好,请记得点击右边漂浮的分享程序,把好文章分享给你的好朋友们!普通的web运用,都邑应用ajax轮询来取得办事器的更新。但轮询方法会增长办事器的压力,并且许多要求取得的数据并没有更新,这些要求都是有意义的,徒增办事器压力罢了。
应用Comet技术可以必定水平地处理以上成绩。Comet的完成许多,年夜多半须要应用特定的HTTPServer来完成。本文引见应用基于python的TornadoWebServer来完成ServerSide的Comet,为了切近临盆情况,还会引见Tornado若何合营Nginx任务。
装置
到http://www.tornadoweb.org/可以下载到最新的Tornado,那边也有装置的解释。
编写第一个Tornado法式
编纂comet.py,内容以下
- #!/usr/bin/envpythonimporttornado.httpserverimporttornado.ioloopimporttornado.webclassMainHandler(tornado.web.RequestHandler):@tornado.web.asynchronous#解释1defget(self):some_async_func(callback=self.wait)defwait(self,result):ifresult:self.write(result)self.finish()#解释2else:tornado.ioloop.IOLoop.instance().add_timeout(time.time()+0.5,lambda:some_async_func(callback=self.wait))#解释3application=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住以后线程,而Tornado是一个单线程Server,会招致其他要求没法履行的成绩。
复制代码
此时履行comet.py,一个non-blocking的server端曾经搭建胜利。
要留意的成绩是,假如不加超机会制,办事端会赓续履行,即便客户端曾经断开。是以还需本身完成超机会制。
Nginx设置装备摆设
- upstreamfrontends{server127.0.0.1:8999;}server{listen8888;location/{proxy_read_timeout1800;proxy_pass_headerServer;proxy_set_headerHost$http_host;proxy_redirectoff;proxy_set_headerX-Real-IP$remote_addr;proxy_set_headerX-Scheme$scheme;proxy_passhttp://frontends;}}
复制代码
此设置装备摆设采取proxyupstream到backend的缘由是便利upstream负载平衡,只须要upstream中添加多几个ip端口便可。后面提过,Tornado是单线程Server,启动cpu核数个Tornado过程并绑定到cpu,可以或许进步机械的吞吐量。
须要特殊指出的是,要依据上述运用的超机会制,设置proxy_read_timeout,proxy_read_timeout必需年夜于运用的超时。不然将会有504要求前往。
至此,一个Comet运用的办事器端就完成了。因为Comet应用的是长衔接机制,须要特殊留意从客户端到真正后端法式之间每一个环节的超机会制,并且收集衔接的弗成靠性影响将会更年夜,须要斟酌更多界限前提。
参考材料:
- http://www.tornadoweb.org/documentation
欢迎大家来到仓酷云论坛! |
|