python 使用tornadio書寫介面(二)-非同步呼叫介面
最近看了一下tornadio非同步呼叫的功能,做一個小總結,ps:有一些很好的文章我會把連結放到最後,供大家參考。
簡單說一下我理解的同步和非同步的概念,同步和非同步指的呼叫方而言就是http請求中對應request。
同步:是我呼叫一個介面,服務端要做處理,處理完成後給我返回response,這等待response過程中我是不做任何處理的,掛起狀態。
非同步:同理我呼叫一個介面發起一個request1,服務端做一些處理,在這個等待過程中我可以繼續發起其他引數的請求request2,當服務端處理完成後會回調發起者或者發起者輪詢看看服務端處理完成沒有(我覺得輪詢比較高大上的,但是tornadio的asyn
chronous裝飾器是採用回撥callback的形式)。
阻塞和非阻塞就是指服務端處理方是隻能處理單一請求(我理解線性請求一個完事在處理另一個)還是可以同時處理多個。(ps:阻塞和非阻塞我理解就是對應http請求的response)
按照這種我可以4種形式,同步阻塞,同步非阻塞,非同步阻塞(這種經典IO形式吧),非同步非阻塞。
目前我就看一下client的非同步呼叫。tornadio非同步呼叫可以使用裝飾器就可以完成需求,一共兩個asynchronous和coroutine兩個類就可以實現。如圖:
1.使用asynchronous裝飾器完成非同步呼叫:
圖片中有對應標記,我剛開始比較難理解就是on_response()方法為什麼會有一個response引數,當然我還沒有看原始碼,大體猜的在fetch()方法這塊沒有看懂不知道什麼時候吧on_response()方法的response引數傳進去,後面我再看看。
非同步呼叫結果如圖:
這裡面有一點要說的就是on_response()方法中最後一定要呼叫on_finish()方法,來結束,如果不呼叫on_finish()方法會一直沒有返回結果,一直pending中。ps:之前我除錯的時候就忘記了,後面一直沒有返回,找了很久哪裡不對,最後發現沒有寫on_finish()
2.使用coroutine完成非同步呼叫:
功能都是一樣的有一點就是必須要使用yield來呼叫生成器,來完成非同步呼叫,結果也和上圖結果一致。
總結:asynchronous裝飾器和coroutine裝飾器,卻別在於asynchronous需要有一個回撥函式在回撥函式中可以做一些處理並且回撥函式需要用on_finish()作為結束標誌。coroutine不需要回調函式但是需要yield來生成請求。
參考連結: