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.

Cómo crear una función para un comando que procesa concurrentemente.

Cuando escribo el comando !sleeper en Discord, inmediatamente después escribo !hello. El bot se pausa durante 10 segundos mientras procesa !sleeper. Después de los 10 segundos, envía el mensaje He estado durmiendo por 10 segundos y a continuación, ¡Hola compañero!. ¿Cómo puedo evitar que el bot se “congele” si alguien usa el comando !sleeper?

Lo que está sucediendo ahora:

  1. Escribo !sleeper
  2. Escribo !hello
  3. El bot espera entre 9 y 10 segundos
  4. El bot envía He estado durmiendo por 10 segundos
  5. El bot envía ¡Hola compañero!

Lo que quiero:

  1. Escribo !sleeper
  2. Escribo !hello
  3. El bot envía ¡Hola compañero!
  4. El bot espera entre 9 y 10 segundos
  5. El bot envía He estado durmiendo por 10 segundos

PD: Escribí “espera entre 9 y 10 segundos” porque me toma alrededor de un segundo escribir !hello.

import time

from discord.ext import commands


class Hello(commands.Cog):
    def __init__(self, client):
        self.client = client

    @commands.Cog.listener()
    async def on_ready(self):
        print(f'{self.__class__.__name__} Cog está lista')

    @commands.command()
    async def hello(self, ctx):
        await ctx.send('¡Hola compañero!')

    @commands.command()
    async def sleeper(self, ctx):
        await asyncio.sleep(10)
        await ctx.send('He estado durmiendo por 10 segundos')

def setup(client):
    client.add_cog(Hello(client))
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para evitar la pausa de todo el bot al utilizar el comando !sleeper, puedes utilizar la función asyncio.sleep() en lugar de time.sleep(). De esta manera, el bot puede seguir ejecutando otros comandos mientras se procesa el comando !sleeper. Puedes modificar la función sleep_now() para utilizar asyncio.sleep() y marcarla como async. Aquí tienes un ejemplo:

    import asyncio
    from discord.ext import commands
    
    class Hola(commands.Cog):
        def __init__(self, client):
            self.client = client
    
        @commands.Cog.listener()
        async def on_ready(self):
            print(f'{self.__class__.__name__} Cog está listo')
    
        @commands.command()
        async def hola(self, ctx):
            await ctx.send('¡Hola compañero!')
    
        @commands.command()
        async def sleeper(self, ctx):
            await self.sleep_now()
            await ctx.send('He estado durmiendo durante 10 segundos')
    
        async def sleep_now(self):
            await asyncio.sleep(10)
    
    def setup(client):
        client.add_cog(Hola(client))
    

    Con esta modificación, deberías ser capaz de enviar !hola mientras el comando !sleeper se está procesando sin que el bot se detenga.

Comments are closed.