Hoy hablaremos de cómo, a partir de la idea de medir la velocidad, se creó un script para subir un archivo de imagen y enviarlo de vuelta al servidor, con el cálculo del tiempo de ejecución de cada una de las funciones y el cálculo de la velocidad.
Comenzaré con una lista de bibliotecas usadas:
- importar sistema operativo
- desde el grupo de importación multiprocesamiento
- tiempo de importación
- importar pandas como pd
- solicitudes de importación
A continuación, necesitamos una lista de servidores, preferí crear un diccionario para esto:
server_list = [
{
'server_id': 3682,
'download': 'http://moscow.speedtest.rt.ru:8080/speedtest/random7000x7000.jpg',
'upload': 'http://moscow.speedtest.rt.ru:8080/speedtest/upload.php'
}
]
Escribamos la primera función:
def download(id, path):
start = time.time()
file_name = str(id) + str(path.split('/')[-1])
try:
r = requests.get(path, stream=True, timeout=5)
except:
return 0
size = int(r.headers.get('Content-Length', 0))
with open(file_name, 'wb') as f:
for chunk in r.iter_content(chunk_size=1024):
if chunk:
f.write(chunk)
end = time.time()
duration = end - start
sp = (((size * 8) / 1024) / 1024) / duration
return sp
Ahora más sobre lo que está sucediendo.
La función tiene una hora de inicio y una hora de finalización (en segundos), de la que posteriormente obtenemos la vida útil. Escribimos la identificación del servidor y el nombre de la imagen en el nombre del archivo (hecho para que no haya conflictos al cargar desde múltiples fuentes). A continuación, hacemos una solicitud GET, obtenemos el tamaño del archivo (en bytes) y lo guardamos en el disco. Traducimos bytes a bits, un poco más de magia con fórmulas y en la salida tenemos una velocidad en MBit / s.
La siguiente función es subir un archivo al servidor:
def upload(id, path):
start = time.time()
file_name = str(id) + 'random7000x7000.jpg'
with open(file_name, 'rb') as f:
files = {'Upload': (file_name, f.read())}
try:
requests.post(path, files=files)
except:
return 0
size = os.path.getsize(file_name)
end = time.time()
duration = end - start
sp = (((size * 8) / 1024) / 1024) / duration
return sp
El principio es el mismo aquí, solo que tomamos un archivo de una carpeta local y lo enviamos con una solicitud POST.
Nuestra siguiente tarea es obtener datos de las dos funciones anteriores. Escribamos una función más:
def test_f(conn, server):
speed_download = download(server['server_id'], server['download'])
speed_upload = upload(server['server_id'], server['upload'])
return server['server_id'], speed_download, speed_upload
Lo único que queda por hacer es agregar multiprocesamiento con un grupo y una función de mapa paralelo :
def main():
pool = Pool()
data = pool.map(test_f, server_list)
df = pd.DataFrame(data, columns=['Server', 'Download', 'Upload'])
print(df)
pool.close()
pool.join()
if __name__ == '__main__':
main()
El script está listo para usar, para la conveniencia de la salida utilicé la biblioteca de pandas. También puede poner la salida en la base de datos y recopilar estadísticas para su análisis.
¡Gracias por su atención!
UPD: Se corrigieron excepciones, se hicieron correcciones al trabajo de multiprocesamiento (se reemplazó el bucle con una función en paralelo), se agregó un tiempo de espera para la solicitud GET