最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python獲取接口請(qǐng)求耗時(shí)的方法詳解

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

你想知道我們請(qǐng)求一個(gè)url的時(shí)候,握手和請(qǐng)求資源分別占用多長時(shí)間么?今天我們使用python寫個(gè)小案例來看看吧。

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],"握手耗時(shí): %.6fs" %(shakeInfo[1]) , "請(qǐng)求接口耗時(shí): %.6fs" %(responseInfo[1]) ,"總共耗時(shí)為: %.6fs" % (shakeInfo[1] + responseInfo[1]))

if __name__ == '__main__':
    main()

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

項(xiàng)目展示

打開項(xiàng)目,修改hosts、portmethods以及url的變量,即可運(yùn)行python程序便可獲得該頁面的詳細(xì)信息的時(shí)間,其中包括TCP/IP三次握手時(shí)間 以及 請(qǐng)求接口耗時(shí),最后是 總的耗時(shí),

如何獲得握手時(shí)間

在獲取握手時(shí)間的時(shí)候,不能使用http庫,例如: requests,因?yàn)樗J(rèn)會(huì)進(jìn)行tcp/ip三次握手,而后再進(jìn)行資源請(qǐng)求,所以我們要使用socket來做這個(gè)需求。

python中,socket提供了一種跨平臺(tái)的網(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))

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

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

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

如上代碼,當(dāng)遠(yuǎn)程服務(wù)器連不上的時(shí)候或者其他異常的時(shí)候,該代碼會(huì)拋異常,若沒有異常,則證明端口通的。

我們僅需要在此之前和之后,都拉一下當(dāng)前時(shí)間戳,就可以計(jì)算出握手所耗費(fèi)的時(shí)間,例如:

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)

若沒有拋錯(cuò),我們即可獲得握手時(shí)間。

如何獲得請(qǐng)求時(shí)間

握手成功后,我們就可以向該服務(wù)器發(fā)送http報(bào)文了,注意最簡單報(bào)文的格式是:

請(qǐng)求方法 請(qǐng)求路由 版本號(hào)
請(qǐng)求頭(主機(jī)名)
空行

例如:

GET / HTTP/1.1
Host: 127.0.0.1:8080

如果我們不添加Host請(qǐng)求頭,則會(huì)拋錯(cuò): HTTP/1.1 400 Bad Request: missing required Host header

python中,我們直接使用s.send()函數(shù)即可發(fā)送請(qǐng)求,例如:

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個(gè)\r\n是有一個(gè)空行,來標(biāo)志http請(qǐng)求頭的結(jié)束。

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

這里可以使用s.recv()函數(shù)來讀取服務(wù)器傳回來的信息,例如讀取從服務(wù)器返回的15個(gè)字節(jié)s.recv(15)

我們可以參考計(jì)算握手時(shí)間的方法,來計(jì)算一下資源請(qǐng)求的時(shí)間,代碼如下:

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])

如果遠(yuǎn)程主機(jī)和遠(yuǎn)程端口都正常的話,我們大概會(huì)得到如下的信息:

善用裝飾器

我們計(jì)算握手時(shí)間,和計(jì)算資源請(qǐng)求時(shí)間,都是相同的代碼,因?yàn)橛?jì)算的功能不同,所以我們需要被迫寫2次,這個(gè)時(shí)候,就可以使用裝飾器,來把這個(gè)額外非核心功能給抽離出來,而將計(jì)算握手和計(jì)算資源請(qǐng)求都給封裝為函數(shù),而后通過函數(shù)來調(diào)用裝飾器,就可以獲取2種請(qǐng)求時(shí)間了。

我們先將裝飾器抽離出來:

def funcRunTimes(func):
    def wrapper(*args):
        startTime = time.time()
        result = func(*args)
        endTime = time.time()
        execTime = endTime - startTime
        return (result,execTime)
    return wrapper

我們?cè)?code>funcRunTimes中直接返回wrapper函數(shù),而在wrapper函數(shù)中,定義開始時(shí)間和結(jié)束時(shí)間,在二者的中間執(zhí)行函數(shù)func,最后將func的結(jié)果以及函數(shù)執(zhí)行的時(shí)間封裝為一個(gè)元組進(jìn)行返回。

此時(shí),我們可以封裝函數(shù)了,例如我們想獲取握手的時(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

如果該遠(yuǎn)程主機(jī)可以連上,我們直接返回socket句柄,若連接不上,直接打印錯(cuò)誤,返回None。

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

shakeInfo = shakeHands(hosts,port)

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

我們?cè)賹①Y源請(qǐng)求函數(shù)封裝一下,就可以完成這個(gè)項(xiàng)目了。

總結(jié)

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

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

相關(guān)文章

  • django中日志模塊logging的配置和使用方式

    django中日志模塊logging的配置和使用方式

    文章主要介紹了如何在Django項(xiàng)目的`settings.py`文件中配置日志記錄,并使用日志模塊記錄不同級(jí)別的日志,日志級(jí)別包括DEBUG、INFO、WARNING、ERROR和CRITICAL,級(jí)別越高,記錄的日志越詳細(xì),通過配置和使用日志記錄器,可以更好地排查和監(jiān)控系統(tǒng)問題
    2025-01-01
  • python?pip安裝庫下載源更換(清華源、阿里源、中科大源、豆瓣源)

    python?pip安裝庫下載源更換(清華源、阿里源、中科大源、豆瓣源)

    為了提高Python包的下載速度和穩(wěn)定性,可以配置國內(nèi)的鏡像源,如清華源、阿里源、中科大源和豆瓣源,設(shè)置方法簡單,只需更改pip的配置文件或使用命令行即可,需要的朋友可以參考下
    2024-10-10
  • 使用Python和python-pptx構(gòu)建Markdown到PowerPoint轉(zhuǎn)換器

    使用Python和python-pptx構(gòu)建Markdown到PowerPoint轉(zhuǎn)換器

    在這篇博客中,我們將深入分析一個(gè)使用 Python 開發(fā)的應(yīng)用程序,該程序可以將 Markdown 文件轉(zhuǎn)換為 PowerPoint 演示文稿,我們將探討代碼結(jié)構(gòu)、功能和關(guān)鍵組件,并解決一個(gè)特定的 bug,需要的朋友可以參考下
    2025-03-03
  • 對(duì)Python 內(nèi)建函數(shù)和保留字詳解

    對(duì)Python 內(nèi)建函數(shù)和保留字詳解

    今天小編就為大家分享一篇對(duì)Python 內(nèi)建函數(shù)和保留字詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • Kotlin 中的 apply 函數(shù)用法詳解

    Kotlin 中的 apply 函數(shù)用法詳解

    apply 函數(shù)是 Kotlin 中一個(gè)十分方便的工具,它使得對(duì)對(duì)象進(jìn)行初始化和配置變得更加簡潔、清晰,通過與 Java 的對(duì)比,我們可以看出 Kotlin 在處理類似情況時(shí)具有更高的表現(xiàn)力和簡潔性,本文給大家介紹Kotlin apply 函數(shù)的用法,感興趣的朋友一起看看吧
    2024-03-03
  • django model object序列化實(shí)例

    django model object序列化實(shí)例

    這篇文章主要介紹了django model object序列化實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • 如何給pip更換國內(nèi)源并配置Python的國內(nèi)鏡像詳解

    如何給pip更換國內(nèi)源并配置Python的國內(nèi)鏡像詳解

    pip安裝的包都存在于外國的服務(wù)器上,速度會(huì)非常慢,可以給pip配置國內(nèi)鏡像,直接從國內(nèi)服務(wù)器安裝依賴,這篇文章主要介紹了如何給pip更換國內(nèi)源并配置Python的國內(nèi)鏡像的相關(guān)資料,需要的朋友可以參考下
    2025-04-04
  • tensorflow學(xué)習(xí)筆記之mnist的卷積神經(jīng)網(wǎng)絡(luò)實(shí)例

    tensorflow學(xué)習(xí)筆記之mnist的卷積神經(jīng)網(wǎng)絡(luò)實(shí)例

    這篇文章主要為大家詳細(xì)介紹了tensorflow學(xué)習(xí)筆記之mnist的卷積神經(jīng)網(wǎng)絡(luò)實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • python 找出list中最大或者最小幾個(gè)數(shù)的索引方法

    python 找出list中最大或者最小幾個(gè)數(shù)的索引方法

    今天小編就為大家分享一篇python 找出list中最大或者最小幾個(gè)數(shù)的索引方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • python通過pil將圖片轉(zhuǎn)換成黑白效果的方法

    python通過pil將圖片轉(zhuǎn)換成黑白效果的方法

    這篇文章主要介紹了python通過pil將圖片轉(zhuǎn)換成黑白效果的方法,實(shí)例分析了Python中pil庫的使用技巧,需要的朋友可以參考下
    2015-03-03

最新評(píng)論

元阳县| 丰都县| 旬阳县| 永兴县| 吉林市| 佛学| 泰顺县| 邹城市| 游戏| 包头市| 衡山县| 古田县| 胶南市| 碌曲县| 四子王旗| 乌兰浩特市| 柯坪县| 洛南县| 济源市| 茶陵县| 昆山市| 个旧市| 红安县| 英吉沙县| 江安县| 武夷山市| 昌平区| 大新县| 宝鸡市| 建德市| 巴中市| 加查县| 新巴尔虎右旗| 吉木萨尔县| 札达县| 巩义市| 天长市| 长兴县| 抚顺县| 孟连| 沙田区|