猿问

tornado HTTPClient 和 gen 模块的实际区别

刚刚在看tornado的gen模块http://www.tornadoweb.org/documentati...classAsyncHandler(RequestHandler):
@asynchronous
defget(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.engine
defget(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.body
excepthttpclient.HTTPError,e:
print"Error:",e也可以实现同步的代码风格,实际上应该也是异步执行,因为用到了IOLoop我的问题是
1.tornado.httpclient.HTTPClient用在生产环境有问题嘛?
2.两种写法达到的效果是不是一样的,如果不一样,有什么区别?
天涯尽头无女友
浏览 342回答 2
2回答

DIEA

你这种写法的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.
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答