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.

Solicitud asíncrona con OpenAPI Generator Python

Feliz Año Nuevo a todos.

Tengo un caso particular en el que estoy usando el generador OpenAPI para llamar a la API en otro Microservicio.
Tengo dos microservicios, es decir, User y Customer.
Entonces, en Customer estoy obteniendo la información de varios usuarios de User. A continuación se muestra el código de ejemplo:

from user.api_clients import User
user_id = [1, 2, 3, 4, 5, 6, 7, 8, 9]
user_list = [User.api.get(id=i) for i in user_id]

Y el código anterior me dará los datos del usuario desde User. En resumen, golpeará la API de usuario de User 9 veces, una por una.
Entonces, ¿hay alguna manera de hacer esto en un solo disparo con asyncio? Soy nuevo en esto de las tareas asíncronas en Python. Así que agradecería mucho si alguien puede darme una idea de cómo hacerlo.

También hay un caso similar en el que quiero obtener un objeto del modelo User en un solo disparo para esta lista de ids de usuario. Sí, puedo usar id_in=user_id, pero ¿hay alguna forma de golpear el siguiente código en un solo disparo, como el siguiente código?

user_id = [1, 2, 3, 4, 5, 6, 7, 8, 9]
user_obj = [User.objects.get(id=i) for i in user_id]

Gracias por tu ayuda.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    ¡Hola y feliz año nuevo!

    Sí, es posible llamar a la API de usuario desde el microservicio de usuario de una sola vez con asyncio. Puedes usar el método asyncio.gather para ejecutar múltiples funciones de coroutine de manera concurrente.

    Aquí tienes un ejemplo de código:

    import asyncio
    from user.api_clients import User
    
    async def obtener_datos_usuario(id_usuario):
        datos_usuario = await User.api.get(id=id_usuario)
        return datos_usuario
    
    async def principal():
        ids_usuario = [1, 2, 3, 4, 5, 6, 7, 8, 9]
        tareas = [obtener_datos_usuario(i) for i in ids_usuario]
        lista_usuarios = await asyncio.gather(*tareas)
        return lista_usuarios
    
    lista_usuarios = asyncio.run(principal())
    

    En el código anterior, creamos una función de coroutine llamada “obtener_datos_usuario” que llama al método User.api.get con el id_usuario y devuelve los datos del usuario. Luego, creamos otra función de coroutine llamada “principal” donde creamos una lista de coroutines para cada id de usuario y usamos asyncio.gather para ejecutar todas las coroutines de manera concurrente y devolver el resultado como una lista.

    De manera similar, para obtener objetos del modelo de usuario de una sola vez, puedes usar el método select_related para minimizar las consultas a la base de datos.

    Aquí tienes un ejemplo de código:

    ids_usuario = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    queryset_usuario = User.objects.filter(id__in=ids_usuario).select_related()
    objetos_usuario = [usuario for usuario in queryset_usuario]
    

    En el código anterior, usamos el método filter para filtrar los usuarios con la lista de ids_usuario proporcionada y usamos el método select_related para obtener los objetos relacionados (si los hay) y minimizar las consultas a la base de datos.

    ¡Espero que esto te ayude! Hazme saber si tienes alguna otra pregunta.

Comments are closed.