亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

tornado HTTPClient 和 gen 模塊的實際區別

tornado HTTPClient 和 gen 模塊的實際區別

千萬里不及你 2019-04-06 08:31:40
剛剛在看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):@[email protected](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 回答

?
慕田峪7331174

TA貢獻1828條經驗 獲得超13個贊

你這種寫法的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.
                            
查看完整回答
反對 回復 2019-04-06
  • 2 回答
  • 0 關注
  • 313 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號