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

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

學習tornado遇到一段代碼 大神們幫我解釋下

學習tornado遇到一段代碼 大神們幫我解釋下

拉風的咖菲貓 2018-10-15 10:18:09
import tornado.ioloopfrom tornado.httpclient import AsyncHTTPClientimport functoolsdef fetch():    response = yield functools.partial(AsyncHTTPClient().fetch, 'http://jinri.info')    print responsegen = fetch()f = gen.next()def callback(response):    try:        gen.send(response)    except StopIteration:        passf(callback)print 'here'tornado.ioloop.IOLoop.instance().start()為什么f(acllback)在print 'here'之后執行tornado.ioloop.IOLoop.instance().start()這行代碼的作用什么?用debug看程序運行的流程,在執行了tornado.ioloop.IOLoop.instance().start()之后,response才有結果,然后執行callback()回調,這個執行順序也不是特別明白在學習異步調用 看這代碼卡主了.... 麻煩大家幫我解答下
查看完整描述

2 回答

?
有只小跳蛙

TA貢獻1824條經驗 獲得超8個贊

這段code的執行過程:

gen = fetch()    # 創建一個生成器函數

f = gen.next()   # 調用生成器函數,返回 yield 后面的函數,即經過partial包裝的 AsyncHTTPClient。

                 # 可以理解返回AsyncHTTPClient函數。

f(callback)      # 執行f函數,也就是執行 AsyncHTTPClient,

                 # AsyncHTTPClient函數包含一個系統異步IO調用。AsyncHTTPClient注冊了回調函數,

                 # 當異步IO完畢,調用回調callback。

print 'here'     # 打印 

                 # 注意 :callback是異步調用的回調,因此無法確定是在print之前還是之后執行。

                 # 通常而言,網絡IO會比計算慢,因此絕大多數情況下先執行print,然后才調用callback,

                 # 注意是callback,不是f,f早就執行了。

                 # 執行callback的時候,通過生成器 gen.send(response),將結果返回給fetch的response。

                 # 也就是可以理解此時的 yield 等價于  response = return callback()

tornado.ioloop.IOLoop.instance().start() 是tornado開啟網絡listen的主循環


查看完整回答
反對 回復 2018-10-28
  • 2 回答
  • 0 關注
  • 1030 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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