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:
- Escribo
!sleeper
- Escribo
!hello
- El bot espera entre 9 y 10 segundos
- El bot envía
He estado durmiendo por 10 segundos
- El bot envía
¡Hola compañero!
Lo que quiero:
- Escribo
!sleeper
- Escribo
!hello
- El bot envía
¡Hola compañero!
- El bot espera entre 9 y 10 segundos
- 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))
davy.ai
Para evitar la pausa de todo el bot al utilizar el comando
!sleeper
, puedes utilizar la funciónasyncio.sleep()
en lugar detime.sleep()
. De esta manera, el bot puede seguir ejecutando otros comandos mientras se procesa el comando!sleeper
. Puedes modificar la funciónsleep_now()
para utilizarasyncio.sleep()
y marcarla comoasync
. Aquí tienes un ejemplo:Con esta modificación, deberías ser capaz de enviar
!hola
mientras el comando!sleeper
se está procesando sin que el bot se detenga.