1
votes

Exécuter une fonction après un certain laps de temps

Je construis un bot discord avec discordpy et je veux qu'une fonction soit exécutée toutes les dix minutes (pour un mini-jeu) mais si j'utilise time.sleep tout le programme se fige et attend cette fois, rendant mon bot complètement inutile à cause du fait que time.sleep arrête le programme de s'exécuter. Discordpy fonctionne également avec les fonctions et les événements asynchrones, il est donc très difficile de trouver un endroit pour mettre une boucle while. Y a-t-il un module que je peux utiliser pour exécuter une fonction toutes les dix minutes sans arrêter le flux de mon bot?

edit: avec discordpy, vous définissez toutes vos fonctions asynchrones ainsi:

@client.event
async def on_message(message):
    # Code

Et qu'à la fin du fichier vous écrivez: client.run () Ce que je dis, c'est que je ne peux pas utiliser une boucle while infinie à cause du fait que je dois atteindre cette ligne, sans cette ligne, le bot sera inutile, alors quelle est ma question, puis-je "attacher" une minuterie à mon script pour que toutes les dix minutes je puisse exécuter une fonction?


0 commentaires

4 Réponses :


0
votes

Dites-moi ce que vous en pensez. Si cela ne fonctionne pas avec votre code, je peux l'ajuster:

import time
starttime=time.time()
def thing():
  print('hi')
while True:
  thing()
  time.sleep(60.0 - ((time.time() - starttime) % 60.0))

C'est dans une boucle while donc je ne sais pas dans quelle mesure cela fonctionnera avec votre code mais comme c'est un bot qui s'exécute plusieurs fois, cela pourrait fonctionner. Bien sûr, si vous voulez qu'il ne s'exécute que 5 fois par exemple, vous pouvez simplement dire pour i dans la plage (5): J'espère que cela vous aidera!


4 commentaires

Il n'y a pas de place pour mettre cette boucle en raison du fait qu'avec discordpy, le bot s'exécute sur une boucle via une fonction. Par exemple, vous appelez simplement client.run () et cela va dans un temps infini alors, je n'ai pas trouvé d'endroit pour mettre cela là où c'est efficace.


Maintenant, cela exécute la fonction de temps en temps, mais cela ne permet pas l'exécution du bot.


Eh bien, si votre fonction s'exécute sur une boucle, est-il possible de la supprimer ?. Pensez-vous que vous pouvez modifier votre question et insérer notre code afin qu'il soit plus facile de vous aider. Parce que je pourrais peut-être le pousser quelque part.


Dans Discordpy, vous tapez toutes vos fonctions asynchrones, puis en bas vous tapez client.run () qui est une boucle infinie, comme le seul moyen d'en sortir est de tuer le programme. Il n'y a donc pas de boucle à laquelle je peux ajouter du code que je peux voir.



1
votes

vous utilisez la planification pour ce

import threading

def hello_world():
    while True:
       print("Hello, World!")
       time.sleep(600)
t1 = threading.Thread(target=hello_world)
t1.start()
while True:
   print('in loop')
   time.sleep(1)

ou vous pouvez essayer le threading pour exécuter cette fonction spécifique toutes les 10 minutes

import sched, time
sch = sched.scheduler(time.time, time.sleep)
def run_sch(do): 
   print("running at 10 mins")
   # do your stuff
   sch.enter(600, 1, run_sch, (do,))

sch.enter(600, 1, run_sch, (s,))
sch.run()


4 commentaires

J'ai essayé celui-ci et je pense que l'exécution du programme s'arrête également. Je fais peut-être juste mal.


essayez la deuxième qui n'arrêtera pas votre exécution d'une autre tâche..toutes les fonctions du thread pour lesquelles vous voulez exécuter en parallèle


Celui-ci semble fonctionner, mais avec le threading, il est important que mon programme soit arrêté de force. (Je pense que cela s'appelle l'interruption du clavier)


Ce n’est pas une bonne solution. Discord.py utilise asyncio donc la bonne façon de le faire serait d'attendre asyncio.sleep Veuillez vous référer à ma réponse.



0
votes

Essayez quelque chose comme ceci,

Threading along with sleep.
Use of Twisted package etc..

De plus, il existe différents packages que nous pouvons utiliser pour réaliser cette fonctionnalité.

import sched
sched.scheduler(params)
import schedule

def worker():
    print("Executing...")

schedule.every(10).minutes.do(worker)

while True:
    schedule.run_pending()
    time.sleep(1)


1 commentaires

J'ai essayé de reproduire cela mais à cause de la boucle while infinie au bas de votre code, l'exécution du programme n'atteint jamais client.run () par exemple. Dans Discordpy, vous configurez toutes vos fonctions asynchrones, puis au bas du script vous tapez client.run () et cette fonction est la boucle infinie dans laquelle je dois être, mais parce que cela utilise un, je ne l'atteins jamais.



0
votes

Discord.py est construit avec le module asyncio python. Pour dormir la tâche en cours dans asyncio, vous devez attendre sur asyncio.sleep () Notez que cela ne bloquera pas votre thread ou la boucle d'événement et c'est exactement ce que vous devez utiliser.

import asyncio #Top of your file
...

await asyncio.sleep(10) #Doesn't blocks the rest of the program!


0 commentaires