Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

executer une methode à partir d'une certaine heure

+3 votes

j'ai un daemon qui fait un traitement de fond. J'aimerai qu'a une certaine heure (non precise) il execute une methode non recurrente (pousser une valeur dans redis).

Une tache cron ne suffit pas car ce n'est pas repetitif et je ne connais pas l'heure à l'avance, de plus je ne vois pas comment faire autrement qu'en forkant pour appeler cron -e dans ce cas la.

sched ne semble pas suffisant car on ne peut pas ajouter d'evenement apres le lancement.

demandé 31-Mar-2015 par juke (318 points)
edité 3-Avr-2015 par juke

https://docs.python.org/2/library/sched.html

je viens de decouvrir https://docs.python.org/2/library/sched.html

je laisse le post ouvert à d'autres suggestions.

comme tu as mis que l'heure n'était pas définie, il faut bien à un moment donnée aller la chercher, et pour sched il faut bien lui fournir dans le code . Sinon autant faire un cron non ?

en fait ce que j'entendais par non precise c'est qu'il peut y avoir un decalage. genre si je met 16:00 et que ça s'execute à 16:00:03 ce n'est pas grave.

ok donc dans le bout de code de ma réponse, le test ne s'occupe pas des secondes ; mais que des heures/minutes.
Donc est-ce qu'une tâche cron ne suffirait pas du coup ?

Python 3 ou Python 2 ? Car Asyncio a un scheduler intégré ?

4 Réponses

0 votes

je ferai une boucle infinie qui itère toutes les minutes, par exemple, et lit un fichier, contenant l'heure non définie, à laquelle je veux que soit exécutée ma tache.
Si l'heure est atteinte je lance la tâche.
Enfin on fait une pause de 60sec

grosso modo ca donnerait

import time
import arrow


def do_stuff():
    print("wake up little Suzie")

now = arrow.now()
print (now)

while True:
    my_hour = open('filename.txt', 'r').read().split(':')

    new_hour = arrow.get(now.year, now.month, now.day, int(my_hour[0]), int(my_hour[1]))
    print now.hour, now.minute, new_hour.hour, new_hour.minute
    if now.hour == new_hour.hour and now.minute <= new_hour.minute:
        do_stuff()
    time.sleep(60)
répondu 31-Mar-2015 par foxmask (2,892 points)

Ouais mais ça c'est l'implementation naive, mais je cherche un truc un peu plus elegant.

+5 votes

Perso je tenterais d'utiliser schedule qui te permet de faire:

import schedule
import time

def job():
    print("I'm working...")

schedule.every(10).minutes.do(job)
schedule.every().hour.do(job)
schedule.every().day.at("10:30").do(job)
schedule.every().monday.do(job)
schedule.every().wednesday.at("13:15").do(job)

while True:
    schedule.run_pending()
    time.sleep(1)
répondu 31-Mar-2015 par barnumbirr (2,754 points)

interessant mais peut etre usine à gaz si mes taches ne sont pas recurrentes.

0 votes

j'ai fait ça :

class Ordo(object):
    def run(self):
        s = sched.scheduler(time.time, self.daemon)

        while True:
            s.run()
            self.daemon()

    def daemon(self, args=None):
        print "daemon"

qu'en pensez vous ?

répondu 31-Mar-2015 par juke (318 points)

en fait ça ne va pas car j'ai l'impression que l'ont ne peut pas ajouter d'event une fois que run est lancé.

0 votes

le fait d'utiliser un signal http://indexerror.net/1259/signal-setitimer vous trouvez ça deconnant ?

répondu 8-Avr-2015 par juke (318 points)
...