您好,登錄后才能下訂單哦!
本篇內容介紹了“Python獲取接口請求耗時的方法是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
舉例代碼:
import socket import time def funcRunTimes(func): def wrapper(*args): startTime = time.time() result = func(*args) endTime = time.time() execTime = endTime - startTime return (result,execTime) return wrapper @funcRunTimes def shakeHands(hosts,port): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: s.connect((hosts, port)) return s except Exception as e: print(e) return None @funcRunTimes def websiteResponseTime(fd,methods,url): sendMsgs = "%s %s HTTP/1.1\r\nHost: 127.0.0.1:8080\r\n\r\n" %(methods,url) fd.send(sendMsgs.encode()) recv_data = "" while True: recv_data = str(fd.recv(15)) break httpCode = recv_data.split(" ")[1] return httpCode def main(): hosts = "www.juejin.cn" port = 80 methods = "GET" url = "/" print("執行命令為: %s %s:%d %s\n" % (methods, hosts, port, url)) shakeInfo = shakeHands(hosts,port) if shakeInfo == None: print("errors") return responseInfo = websiteResponseTime(shakeInfo[0],methods,url) print("接口狀態碼為:" , responseInfo[0],"握手耗時: %.6fs" %(shakeInfo[1]) , "請求接口耗時: %.6fs" %(responseInfo[1]) ,"總共耗時為: %.6fs" % (shakeInfo[1] + responseInfo[1])) if __name__ == '__main__': main()
項目中使用了python
裝飾器,若還對python
裝飾器不太了解的小伙伴,可以參考一下下面這篇文章:python | 探尋python裝飾器
打開項目,修改hosts
、port
、methods
以及url
的變量,即可運行python
程序便可獲得該頁面的詳細信息的時間,其中包括TCP/IP
三次握手時間 以及 請求接口耗時,最后是 總的耗時,
在獲取握手時間的時候,不能使用http
庫,例如: requests
,因為它默認會進行tcp/ip
三次握手,而后再進行資源請求,所以我們要使用socket
來做這個需求。
在python
中,socket
提供了一種跨平臺的網絡通信接口,可以用它來創建各種類型的網絡連接。
例如代碼如下:
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('127.0.0.1', 8080))
在上面的代碼中,我們先導入socket
庫,而后使用socket.socket()
創建一個socket
句柄,而中間的參數分別代表的意思為:
socket.AF_INET
: 指定IPv4
協議。
socket.SOCK_STREAM
: 指定使用TCP
流式套接字類型。
而s.connect
則開始連接服務器,其參數類型為元組類型,參數值為遠程主機名 和 遠程端口。
如上代碼,當遠程服務器連不上的時候或者其他異常的時候,該代碼會拋異常,若沒有異常,則證明端口通的。
我們僅需要在此之前和之后,都拉一下當前時間戳,就可以計算出握手所耗費的時間,例如:
import socket import time try: startTime = time.time() s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('127.0.0.1', 8080)) endTime = time.time() print("runtimes: " , endTime-startTime) except Exception as e: print("捕獲異常" , e)
若沒有拋錯,我們即可獲得握手時間。
握手成功后,我們就可以向該服務器發送http
報文了,注意最簡單報文的格式是:
請求方法 請求路由 版本號
請求頭(主機名)
空行
例如:
GET / HTTP/1.1
Host: 127.0.0.1:8080
如果我們不添加Host
請求頭,則會拋錯: HTTP/1.1 400 Bad Request: missing required Host header
。
在python
中,我們直接使用s.send()
函數即可發送請求,例如:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('127.0.0.1', 8080)) s.send(b"GET / HTTP/1.1\r\nHost: 127.0.0.1:8080\r\n\r\n")
上述代碼中,\r\n
是換行的意思,也稱之為CRLF
,注意最后的2個\r\n
是有一個空行,來標志http
請求頭的結束。
一般來說,我們請求接口后,會讀取服務器返回來的狀態碼,以便開發驗證是否是成功的。
這里可以使用s.recv()
函數來讀取服務器傳回來的信息,例如讀取從服務器返回的15個字節s.recv(15)
。
我們可以參考計算握手時間的方法,來計算一下資源請求的時間,代碼如下:
import socket import time s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('127.0.0.1', 8080)) startTime = time.time() s.send(b"GET / HTTP/1.1\r\nHost: 127.0.0.1:8080\r\n\r\n") recv_data = str(s.recv(15)) endTime = time.time() print("runtimes: ", endTime - startTime,"接口返回狀態碼: " , recv_data.split(" ")[1])
如果遠程主機和遠程端口都正常的話,我們大概會得到如下的信息:
我們計算握手時間,和計算資源請求時間,都是相同的代碼,因為計算的功能不同,所以我們需要被迫寫2次,這個時候,就可以使用裝飾器,來把這個額外非核心功能給抽離出來,而將計算握手和計算資源請求都給封裝為函數,而后通過函數來調用裝飾器,就可以獲取2種請求時間了。
我們先將裝飾器抽離出來:
def funcRunTimes(func): def wrapper(*args): startTime = time.time() result = func(*args) endTime = time.time() execTime = endTime - startTime return (result,execTime) return wrapper
我們在funcRunTimes
中直接返回wrapper
函數,而在wrapper
函數中,定義開始時間和結束時間,在二者的中間執行函數func
,最后將func
的結果以及函數執行的時間封裝為一個元組進行返回。
此時,我們可以封裝函數了,例如我們想獲取握手的時間,我們可以這樣寫:
@funcRunTimes def shakeHands(hosts,port): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: s.connect((hosts, port)) return s except Exception as e: print(e) return None
如果該遠程主機可以連上,我們直接返回socket
句柄,若連接不上,直接打印錯誤,返回None
。
調用該函數的是,我們接收返回值即可:
shakeInfo = shakeHands(hosts,port)
注意,shakeInfo
是一個元組,有2個元組,第一個是socket
句柄,第二個是執行該函數所需要的時間。
我們再將資源請求函數封裝一下,就可以完成這個項目了。
“Python獲取接口請求耗時的方法是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。