Comprobación de la velocidad de Internet con la biblioteca de solicitudes en multiprocesamiento

¡Buen tiempo, queridos residentes de Habr!



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



All Articles