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("执行命令为: %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装饰器

项目展示

打开项目,修改hostsportmethods以及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 socket连接服务器,以及发送http报文,再计算2个函数所执行的时间,便可以获取到握手和资源请求的时间了,最后再将获取时间的函数提取出来,封装为装饰器,供函数调用,即可得到函数的执行时间了。

到此这篇关于Python获取接口请求耗时的方法详解的文章就介绍到这了,更多相关Python接口请求耗时内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

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

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

    文章主要介绍了如何在Django项目的`settings.py`文件中配置日志记录,并使用日志模块记录不同级别的日志,日志级别包括DEBUG、INFO、WARNING、ERROR和CRITICAL,级别越高,记录的日志越详细,通过配置和使用日志记录器,可以更好地排查和监控系统问题
    2025-01-01
  • python pip安装库下载源更换(清华源、阿里源、中科大源、豆瓣源)

    python pip安装库下载源更换(清华源、阿里源、中科大源、豆瓣源)

    为了提高Python包的下载速度和稳定性,可以配置国内的镜像源,如清华源、阿里源、中科大源和豆瓣源,设置方法简单,只需更改pip的配置文件或使用命令行即可,需要的朋友可以参考下
    2024-10-10
  • 使用Python和python-pptx构建Markdown到PowerPoint转换器

    使用Python和python-pptx构建Markdown到PowerPoint转换器

    在这篇博客中,我们将深入分析一个使用 Python 开发的应用程序,该程序可以将 Markdown 文件转换为 PowerPoint 演示文稿,我们将探讨代码结构、功能和关键组件,并解决一个特定的 bug,需要的朋友可以参考下
    2025-03-03
  • 对Python 内建函数和保留字详解

    对Python 内建函数和保留字详解

    今天小编就为大家分享一篇对Python 内建函数和保留字详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • Kotlin 中的 apply 函数用法详解

    Kotlin 中的 apply 函数用法详解

    apply 函数是 Kotlin 中一个十分方便的工具,它使得对对象进行初始化和配置变得更加简洁、清晰,通过与 Java 的对比,我们可以看出 Kotlin 在处理类似情况时具有更高的表现力和简洁性,本文给大家介绍Kotlin apply 函数的用法,感兴趣的朋友一起看看吧
    2024-03-03
  • django model object序列化实例

    django model object序列化实例

    这篇文章主要介绍了django model object序列化实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • 如何给pip更换国内源并配置Python的国内镜像详解

    如何给pip更换国内源并配置Python的国内镜像详解

    pip安装的包都存在于外国的服务器上,速度会非常慢,可以给pip配置国内镜像,直接从国内服务器安装依赖,这篇文章主要介绍了如何给pip更换国内源并配置Python的国内镜像的相关资料,需要的朋友可以参考下
    2025-04-04
  • tensorflow学习笔记之mnist的卷积神经网络实例

    tensorflow学习笔记之mnist的卷积神经网络实例

    这篇文章主要为大家详细介绍了tensorflow学习笔记之mnist的卷积神经网络实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • python 找出list中最大或者最小几个数的索引方法

    python 找出list中最大或者最小几个数的索引方法

    今天小编就为大家分享一篇python 找出list中最大或者最小几个数的索引方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • python通过pil将图片转换成黑白效果的方法

    python通过pil将图片转换成黑白效果的方法

    这篇文章主要介绍了python通过pil将图片转换成黑白效果的方法,实例分析了Python中pil库的使用技巧,需要的朋友可以参考下
    2015-03-03

最新评论