python|Obtener solicitud de interfaz requiere mucho tiempo

url¿Quieres saber cuánto se tarda en darnos la mano y solicitar recursos cuando lo solicitamos ? Echemos un vistazo a un pequeño caso hoy python.

Los decoradores se utilizan en el proyecto python. Si pythonno sabe mucho sobre decoradores, puede consultar el siguiente artículo:

python | Explorando los decoradores de python: juejin.cn/post/722093…

visualización del proyecto

Abra el proyecto, modifique las variables de hosts, porty methods, urly puede ejecutar pythonel programa para obtener la información detallada de la página, incluido TCP/IPel tiempo de negociación de tres vías y la interfaz de solicitud que consume mucho tiempo, y finalmente el tiempo total,

Cómo obtener el tiempo de apretón de manos

Al obtener el tiempo de negociación, no puede usar httpuna biblioteca, por ejemplo: requests, porque realizará tcp/ipuna negociación de tres vías de forma predeterminada y luego realizará una solicitud de recursos, por lo que debemos usarla socketpara cumplir con este requisito.

En python, socketse proporciona una interfaz de comunicación de red multiplataforma, que se puede utilizar para crear varios tipos de conexiones de red.

Por ejemplo, el código es el siguiente:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 8080))
复制代码

En el código anterior, primero importamos socketla biblioteca y luego la usamos para socket.socket()crear un socketidentificador, y los parámetros del medio significan:

  • socket.AF_INET: especifica IPv4el protocolo.

  • socket.SOCK_STREAM: especifica el uso TCPdel tipo de socket de flujo.

Y s.connectluego comience a conectarse al servidor, el tipo de parámetro es tipo tupla y el valor del parámetro es el nombre del host remoto y el puerto remoto.

Como en el código anterior, cuando el servidor remoto no se puede conectar o se producen otras anomalías, el código arrojará una excepción. Si no hay excepción, prueba que el puerto está conectado.

我们仅需要在此之前和之后,都拉一下当前时间戳,就可以计算出握手所耗费的时间,例如:

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
复制代码

Si el host remoto se puede conectar, devolvemos directamente socketel identificador, si no, imprimimos un error directamente y devolvemos None.

Para llamar a esta función, solo necesitamos recibir el valor de retorno:

shakeInfo = shakeHands(hosts,port)
复制代码

Tenga en cuenta que shakeInfoes una tupla, hay 2 tuplas, la primera es socketel identificador y la segunda es el tiempo requerido para ejecutar la función.

Encapsulemos la función de solicitud de recursos nuevamente para completar el proyecto.

Resumir

Nos python socketconectamos al servidor, enviamos httpmensajes y luego calculamos el tiempo de ejecución de las dos funciones para obtener el tiempo de negociación y solicitud de recursos. Finalmente, extraemos la función de obtención de tiempo y la encapsulamos como un decorador para las llamadas a funciones. puede obtener el tiempo de ejecución de la función.

おすすめ

転載: juejin.im/post/7222573397304246332