es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Resolución de Nombres de Dominio Completo de Python Asincrónico

Tengo una lista de 10k direcciones IP y necesito obtener sus FQDN. Hacerlo de manera sincrónica lleva una eternidad, así que intenté hacerlo de manera asíncrona, pero no veo ninguna diferencia en los tiempos de ejecución.

Método sincrónico:

def test_synch():
    start_time = time.time()
    for ip in ip_list:
        fqdn = socket.getfqdn(ip)
        print(fqdn)
    print("Tiempo para las solicitudes sincrónicas:", time.time()-start_time)

Tiempo de ejecución: 284 segundos para 100 direcciones IP.

Método asíncrono:

async def get_fqdn_async(ip):
    return socket.getfqdn(ip)


async def get_fqdn(ip):
    print("tarea ejecutada para la IP", ip)
    fqdn = await get_fqdn_async(ip)
    print("obtenido fqdn", fqdn, "para la IP", ip)
    return fqdn


async def main():
    tasks = []
    for ip in ip_list:
        task = asyncio.create_task(
            get_fqdn(ip))
        tasks.append(task)

    fqdns = await asyncio.gather(*tasks)
    print(fqdns)

def test_asynch():
    start_time = time.time()
    asyncio.run(main())
    print("Tiempo para las solicitudes asíncronas:", time.time()-start_time)

Tiempo de ejecución: 283 segundos para 100 direcciones IP.

Obviamente estoy haciendo algo mal, pero no puedo entender qué es.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el método asíncrono no está proporcionando ninguna mejora en el tiempo de ejecución. Esto podría deberse a diversos factores como la latencia de la red, el tiempo de respuesta del servidor, etc. Sin embargo, hay algunas cosas que se pueden optimizar en el código:

    1. Aumentar el número de tareas en paralelo: Por defecto, asyncio solo ejecutará un cierto número de tareas simultáneamente. Esto se puede aumentar estableciendo el valor asyncio.SEM_MAX.
    2. Usar una biblioteca resolutoria de DNS: Usar una biblioteca resolutoria de DNS como dnspython puede mejorar el rendimiento de la resolución de los FQDN.

    3. Cachear las respuestas de DNS: Las respuestas de DNS se pueden almacenar en caché en la memoria para evitar solicitudes repetidas de búsqueda.

    En general, es importante tener en cuenta que la programación asíncrona no es una solución milagrosa para todos los problemas de rendimiento. Es importante identificar el cuello de botella y optimizar en consecuencia.

Comments are closed.