亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python獲取接口請求耗時的方法詳解

 更新時間:2023年04月17日 10:00:36   作者:真的不能告訴你我的名字  
你想知道我們請求一個url的時候,握手和請求資源分別占用多長時間么?今天我們就來使用python寫個小案例來看看,感興趣的可以跟隨小編一起了解一下

你想知道我們請求一個url的時候,握手和請求資源分別占用多長時間么?今天我們使用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("執(zhí)行命令為: %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("接口狀態(tài)碼為:" , responseInfo[0],"握手耗時: %.6fs" %(shakeInfo[1]) , "請求接口耗時: %.6fs" %(responseInfo[1]) ,"總共耗時為: %.6fs" % (shakeInfo[1] + responseInfo[1]))

if __name__ == '__main__':
    main()

項目中使用了python裝飾器,若還對python裝飾器不太了解的小伙伴,可以參考一下下面這篇文章:python | 探尋python裝飾器

項目展示

打開項目,修改hosts、portmethods以及url的變量,即可運行python程序便可獲得該頁面的詳細信息的時間,其中包括TCP/IP三次握手時間 以及 請求接口耗時,最后是 總的耗時,

如何獲得握手時間

在獲取握手時間的時候,不能使用http庫,例如: requests,因為它默認會進行tcp/ip三次握手,而后再進行資源請求,所以我們要使用socket來做這個需求。

python中,socket提供了一種跨平臺的網(wǎng)絡(luò)通信接口,可以用它來創(chuàng)建各種類型的網(wǎng)絡(luò)連接。

例如代碼如下:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 8080))

在上面的代碼中,我們先導入socket庫,而后使用socket.socket()創(chuàng)建一個socket句柄,而中間的參數(shù)分別代表的意思為:

  • socket.AF_INET: 指定IPv4協(xié)議。
  • socket.SOCK_STREAM: 指定使用TCP流式套接字類型。

s.connect則開始連接服務(wù)器,其參數(shù)類型為元組類型,參數(shù)值為遠程主機名 和 遠程端口。

如上代碼,當遠程服務(wù)器連不上的時候或者其他異常的時候,該代碼會拋異常,若沒有異常,則證明端口通的。

我們僅需要在此之前和之后,都拉一下當前時間戳,就可以計算出握手所耗費的時間,例如:

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)

若沒有拋錯,我們即可獲得握手時間。

如何獲得請求時間

握手成功后,我們就可以向該服務(wù)器發(fā)送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()函數(shù)即可發(fā)送請求,例如:

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請求頭的結(jié)束。

一般來說,我們請求接口后,會讀取服務(wù)器返回來的狀態(tài)碼,以便開發(fā)驗證是否是成功的。

這里可以使用s.recv()函數(shù)來讀取服務(wù)器傳回來的信息,例如讀取從服務(wù)器返回的15個字節(jié)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,"接口返回狀態(tài)碼: " , recv_data.split(" ")[1])

如果遠程主機和遠程端口都正常的話,我們大概會得到如下的信息:

善用裝飾器

我們計算握手時間,和計算資源請求時間,都是相同的代碼,因為計算的功能不同,所以我們需要被迫寫2次,這個時候,就可以使用裝飾器,來把這個額外非核心功能給抽離出來,而將計算握手和計算資源請求都給封裝為函數(shù),而后通過函數(shù)來調(diào)用裝飾器,就可以獲取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函數(shù),而在wrapper函數(shù)中,定義開始時間和結(jié)束時間,在二者的中間執(zhí)行函數(shù)func,最后將func的結(jié)果以及函數(shù)執(zhí)行的時間封裝為一個元組進行返回。

此時,我們可以封裝函數(shù)了,例如我們想獲取握手的時間,我們可以這樣寫:

@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。

調(diào)用該函數(shù)的是,我們接收返回值即可:

shakeInfo = shakeHands(hosts,port)

注意,shakeInfo是一個元組,有2個元組,第一個是socket句柄,第二個是執(zhí)行該函數(shù)所需要的時間。

我們再將資源請求函數(shù)封裝一下,就可以完成這個項目了。

總結(jié)

我們使用python socket連接服務(wù)器,以及發(fā)送http報文,再計算2個函數(shù)所執(zhí)行的時間,便可以獲取到握手和資源請求的時間了,最后再將獲取時間的函數(shù)提取出來,封裝為裝飾器,供函數(shù)調(diào)用,即可得到函數(shù)的執(zhí)行時間了。

到此這篇關(guān)于Python獲取接口請求耗時的方法詳解的文章就介紹到這了,更多相關(guān)Python接口請求耗時內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python中使用select模塊實現(xiàn)非阻塞的IO

    Python中使用select模塊實現(xiàn)非阻塞的IO

    這篇文章主要介紹了Python中使用select模塊實現(xiàn)非阻塞的IO,本文使用一個簡單聊天室程序講解Python中的select模塊使用,需要的朋友可以參考下
    2015-02-02
  • python 基于AioHttp 異步抓取火星圖片

    python 基于AioHttp 異步抓取火星圖片

    這篇文章主要介紹了python 基于AioHttp 異步抓取火星圖片的方法,幫助大家更好的理解和學習使用python,感興趣的朋友可以了解下
    2021-03-03
  • Python批量裁剪圖片的思路詳解

    Python批量裁剪圖片的思路詳解

    這篇文章主要介紹了Python批量裁剪圖片的程序代碼,是批量裁剪某一文件夾下的所有圖片,并指定裁剪寬高,本文給大家分享實現(xiàn)思路,需要的朋友可以參考下
    2022-07-07
  • PIL.Image.open和cv2.imread的比較與相互轉(zhuǎn)換的方法

    PIL.Image.open和cv2.imread的比較與相互轉(zhuǎn)換的方法

    這篇文章主要介紹了PIL.Image.open和cv2.imread的比較與相互轉(zhuǎn)換的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • python獲取指定日期范圍內(nèi)的每一天,每個月,每季度的方法

    python獲取指定日期范圍內(nèi)的每一天,每個月,每季度的方法

    這篇文章主要介紹了python獲取指定日期范圍內(nèi)的每一天,每個月,每季度的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • python用循環(huán)新建多個列表的代碼實例

    python用循環(huán)新建多個列表的代碼實例

    當我們處理數(shù)據(jù)時,有時候需要創(chuàng)建多個列表以存儲不同類型或不同條件下的數(shù)據(jù),在Python中,我們可以利用循環(huán)來快速、高效地創(chuàng)建這些列表,本文將介紹如何使用循環(huán)在Python中創(chuàng)建多個列表,并提供代碼實例,需要的朋友可以參考下
    2024-04-04
  • Python的Flask框架中實現(xiàn)登錄用戶的個人資料和頭像的教程

    Python的Flask框架中實現(xiàn)登錄用戶的個人資料和頭像的教程

    這篇文章主要介紹了Python的Flask框架中實現(xiàn)登錄用戶的個人資料和頭像的教程,這也是各個web框架的最基本功能之一,需要的朋友可以參考下
    2015-04-04
  • Python中橫向或縱向拼接兩個表方法實例

    Python中橫向或縱向拼接兩個表方法實例

    最近要將兩個表格合并,Python處理起來很簡單,所以這篇文章主要給大家介紹了關(guān)于Python中橫向或縱向拼接兩個表的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-07-07
  • 解決pyttsx3無法封裝的問題

    解決pyttsx3無法封裝的問題

    今天小編就為大家分享一篇解決pyttsx3無法封裝的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • python 重命名軸索引的方法

    python 重命名軸索引的方法

    今天小編就為大家分享一篇python 重命名軸索引的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11

最新評論