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.

Mi bot de Discord utilizando PRAW a veces responde rápido y otras veces lento.

Estoy desarrollando un bot de Discord en Python que obtendrá una imagen aleatoria de un subreddit en Reddit y la enviará a mi canal de Discord cuando escriba una frase específica. Utilizo PRAW para obtener datos de Reddit y discord.py para trabajar con Discord.

Mi problema es que, cuando escribo la frase en Discord, el bot a veces responde de inmediato, pero otras veces tarda de 3 a 5 segundos e incluso de 10 a 20 segundos en responder. Aquí hay dos videos para una comparación más detallada. Respuesta lenta – Respuesta rápida.

He realizado algunas pruebas de depuración y descubro que el problema está en la sección de código a continuación:

def get_image_reddit(sub_name):
    global reddit
    sub = reddit.subreddit(sub_name)
    random_post = sub.random()

    # debajo, en caso de que el enlace de respuesta sea una galería
    if random_post.url.startswith('https://www.reddit.com/gallery'):
        post_galleries = reddit.submission(url=random_post.url)
        gallery = []
        for i in post_galleries.media_metadata.items():
            url = i[1]['p'][0]['u']
            url = url.split("?")[0].replace("preview", "i")
            gallery.append(url)
        return gallery

    output = []
    output.append(random_post.url)
    return output

¿Alguien puede ayudarme a resolver este problema? ¡Gracias, que tengas un buen día!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución para una respuesta lenta en el bot de Discord

    La respuesta lenta del bot puede deberse al retraso en la obtención de datos de la API de Reddit. Para mejorar el tiempo de respuesta del bot, puedes implementar la programación asíncrona con el módulo asyncio en Python.

    Aquí están los pasos que puedes seguir:

    1. Importa el módulo asyncio en tu código.
    2. Convierte la función get_image_reddit en una función asíncrona utilizando “async def” en lugar de “def”.

    3. Utiliza el método asyncio.create_task() para ejecutar las funciones asíncronas en segundo plano y evitar bloquear el hilo principal.

    4. Utiliza la palabra clave “await” para esperar la respuesta de la API.

    Aquí está el código modificado:

    import asyncio
    
    def get_image_reddit(sub_name):
        global reddit
        sub = reddit.subreddit(sub_name)
        random_post = sub.random()
    
        # Abajo, en caso de que el enlace de respuesta sea una galería
        if random_post.url.startswith('https://www.reddit.com/gallery'):
            post_galleries = reddit.submission(url=random_post.url)
            gallery = []
            for i in post_galleries.media_metadata.items():
                url = i[1]['p'][0]['u']
                url = url.split("?")[0].replace("preview", 'i')
                gallery.append(url)
            return gallery
    
        output = []
        output.append(random_post.url)
        return output
    
    
    async def send_random_image_on_cmd(message, sub_name):
        try:
            image_url = await asyncio.create_task(get_image_reddit(sub_name))
            await message.channel.send(image_url)
        except Exception as e:
            await message.channel.send("Error: " + str(e))
    
    @bot.event
    async def on_message(message):
        if message.content.startswith("!random image"):
            sub_name = "memes"
            asyncio.create_task(send_random_image_on_cmd(message, sub_name))
    

    Siguiendo los pasos anteriores, el bot responderá más rápido, ya que el código se ejecutará de forma asíncrona y no bloqueará el hilo principal.

    ¡Espero que esta solución te ayude!

Comments are closed.