Tornado Client

參考資料

tornado.httpclient

  • tornado.httpclient包是Tornado自帶的HTTP客戶端,可以視為CURLurllib2
  • tornado.httpclient包包含兩個模塊,一個是同步模塊,一個是異步模塊。

對于應用層的網絡模型是可以分為同步和異步的,同步意味著當前線程是阻塞的,只有當本次請求完成后才能進行下一次的請求。而異步則意味著所有請求均可以同時塞入緩沖區(qū),因此不會阻塞當前的線程。

Tornado的異步包括兩個方面分別為異步服務器和異步客戶端,無論是服務器還是客戶端,具體的異步模型又可以分為回調函數callback和協程coroutine兩種方式。

Tornado客戶端的異步特性主要在于AsyncHTTPClient類的使用,此時的應用場景往往是在Tornado服務內,需要針對另外的IO進行請求和處理。

同步HTTP客戶端

HTTPClient表示同步方式的HTTP客戶端

例如:創(chuàng)建HTTP客戶端并訪問百度首頁

$ vim client.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-

from tornado.httpclient import HTTPClient, HTTPError

# 創(chuàng)建HTTPClient實例
client = HTTPClient()

try:
    # 請求訪問URL獲取HTTP響應HTTPResponse對象
    response = client.fetch("http://www.baidu.com")
    print(response.body)
except HTTPError as error:
    print(error)

# 關閉HTTPClient
client.close()
$ python client.py

HTTPClient實例的fetch方法用于獲取請求所對應的HTTPResponse對象,其原型是

# request可以是一個HTTPRequest對象或一個URL字符串
def fetch(self, requset, **kwargs)

HTTPRequest類和HTTPResponse類定義在httpclient.py文件中

HTTPRequest

HTTPRequest類初始化方法

def __init__(
  self, 
  url, 
  method="GET", 
  headers=None, 
  body=None,
  auth_username=None, 
  auth_password=None, 
  auth_mode=None,
  connect_timeout=None, 
  request_timeout=None,
  if_modified_since=None, 
  follow_redirects=None,
  max_redirects=None, 
  user_agent=None, 
  use_gzip=None,
  network_interface=None, 
  streaming_callback=None,
  header_callback=None, 
  prepare_curl_callback=None,
  proxy_host=None, 
  proxy_port=None, 
  proxy_username=None,
  proxy_password=None, 
  allow_nonstandard_methods=None,
  validate_cert=None, 
  ca_certs=None,
  allow_ipv6=None,
  client_key=None, 
  client_cert=None, 
  body_producer=None,
  expect_100_continue=False, 
  decompress_response=None
):

HTTPRequest類的初始化方法__init__中的關鍵參數

  • url 連接地址
  • method 請求方式,默認為GET。
  • headers 請求的額外頭,可以是HTTPHeader對象也可以是一個字典dict類型。

HTTPResponse

HTTPResponse類表示HTTP響應,其中定義多個字段,關鍵字段包括:

  • request 表示一個HTTPRequest實例
  • code 表示HTTP狀態(tài)碼
  • reason 表示原因解釋
  • headers 表示響應頭,是一個tornado.httputil.HTTPHeaders實例。
  • effective_url 表示經過重定向之后的網址
  • body 表示字符串的響應體
  • error 表示錯誤,出錯則存在Exception異常實例。
  • request_time 表示請求整個過程所消耗的時長,單位為秒。

異步HTTP客戶端

Tornado是一個異步的Web框架,這里的異步指的是Tornado服務器與客戶端的網絡交互是異步的,其根本原因是因為Tornado的底層是基于IOLoopIO事件循環(huán)。如果客戶端請求服務器處理的handler中存在阻塞的耗時操作,那么服務器的整體性能就會下降。幸運的是,Tornado提供了一套異步機制,方便實現自己的異步操作。當handler處理需要進行其它的網絡操作時,Tornado專門提供了一個AsyncHTTPClient的異步HTTP客戶端來支持異步操作。

from tornado.httpclient import AsyncHTTPClient

AsyncHTTPClienttornado.httpclient提供的異步HTTP客戶端,與服務進程一樣,AsyncHTTPClient包含回調callback和攜程yield兩種使用方式,區(qū)別在于回調方式不會返回結果,而協程方式則會返回響應。

例如:創(chuàng)建HTTP異步客戶端訪問百度首頁

$ vim client.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-

from tornado.httpclient import AsyncHTTPClient
from tornado.ioloop import IOLoop

def handle_request(response):
    print(response)
    if response.error:
        print(response.error)
    else:
        print(response.body)

client = AsyncHTTPClient()
client.fetch("http://www.baidu.com", handle_request)

IOLoop.instance().start()

同步與異步客戶端的區(qū)別在于,同步方式需要等待完成整個請求,期間CPU是不能做任何事情的。異步方式在發(fā)出請求后將繼續(xù)做其他事情,請求完成后會產生事件來執(zhí)行handle_request函數。handle_request函數也就是回調函數,和CPU的Interrupt中斷機制一樣,能夠提高程序的運行效率。

client = AsyncHTTPClient()

AsyncHTTPClient是一個異步非阻塞的HTTP客戶端,使用AsyncHTTPClient方法需要提供回調函數callback

client = HTTPClient()

HTTPClient是同步阻塞的HTTP客戶端,它是完全同步的,也就是說當HTTPClient發(fā)生阻塞時,其他人是無法訪問的。

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容