刚刚在看tornado的gen模块http://www.tornadoweb.org/documentati...classAsyncHandler(RequestHandler):@asynchronousdefget(self):http_client=AsyncHTTPClient()http_client.fetch("http://example.com",callback=self.on_fetch)defon_fetch(self,response):do_something_with_response(response)self.render("template.html")可以用gen模块优化成classGenAsyncHandler(RequestHandler):@asynchronous@gen.enginedefget(self):http_client=AsyncHTTPClient()response=yieldgen.Task(http_client.fetch,"http://example.com")do_something_with_response(response)self.render("template.html")ok,现在书抄完了,开始提问我使用tornado.httpclient.HTTPClienthttp_client=httpclient.HTTPClient()try:response=http_client.fetch("http://www.google.com/")printresponse.bodyexcepthttpclient.HTTPError,e:print"Error:",e也可以实现同步的代码风格,实际上应该也是异步执行,因为用到了IOLoop我的问题是1.tornado.httpclient.HTTPClient用在生产环境有问题嘛?2.两种写法达到的效果是不是一样的,如果不一样,有什么区别?
2 回答
DIEA
TA贡献1820条经验 获得超2个赞
你这种写法的run起来当然是没有问题的.但是httpclient.HTTPClient()是blocking的,而Tornado是单进程单线程的,你这样部署在生产环境,一旦有个request向外发起http请求,因为这个向外发起的http请求是blocking的,整个进程会因此block住,后续所有的请求都会被挂起,直到你这个httpclientresponse.所以可用性会很差.答案:1.用在生产环境绝对会有问题.2.一个是同步一个是no-blocking.P.S.Tornado是一个No-blocking的synchronouswebserver,而非纯asynchronouswebserver.很多人混淆这一点.no-blocking真不是异步,,no-blocking的原理就是io的时候进程不断的主动询问kernel数据ready了没有,数据ready了no-blocking从kernel会执行recvfrom从kernel拷数据,这个时候进程是被block住的.在而异步是不需要进程主动询问,kernel在ready的时候发signal给进程.不需要执行revcfrom.
添加回答
举报
0/150
提交
取消