IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

problème pour executer une fonction à une 1 d'intervalle


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Reconversion
    Inscrit en
    Novembre 2018
    Messages
    502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Reconversion
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2018
    Messages : 502
    Points : 300
    Points
    300
    Par défaut problème pour executer une fonction à une 1 d'intervalle
    Bonjour

    Je rencontre un soucis pour executer une fonction qui doit s'éxecuter toutes les heures.
    J'ai fait ceci qui fonctionne très bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    def backup_data_3600():
        insert_data_req()
        time.sleep(3600)
    Mai dès que j'appelle cette fonction avec d'autres dans l'exe de mon programme, du coup ça me bloque tout le reste du script

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    backup_data_3600()
    autre_fonction() # ne s'execute pas
    puis_autre_fonction# ne s'execute pas
    Comment faire pour que mon backup_data_3600() s'execute sans paralyser le reste du script ?

    Cordialement

  2. #2
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Salut,

    Effectivement c'est normal... En JavaScript il y a une fonction spéciale pour faire ça, il faudrait regarder si il n'y a pas l'équivalent en Python... Sinon il faudra le faire soit-même...

    EDIT : J'ai fait une recherche et ce n'est pas les solutions qui manquent mais du coup c'est difficile de faire son choix, il y a des avantages et des inconvénients, je ne sais pas laquelle est la meilleure...

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par olivier252 Voir le message
    Comment faire pour que mon backup_data_3600() s'execute sans paralyser le reste du script ?
    Çà se fait avec des threads (avec Timer).

    Ceci dit, faire un programme qui tourne longtemps est assez difficile à mettre au point: s'il y a un soucis, il faut pouvoir le diagnostiquer et donc créer un fichier "log" qui donnera des indications pertinentes sur ce qu'il se passait au moment où çà plante.

    Il est beaucoup plus facile d'avoir une tache lancée toutes les heures par le système (via cron sur Linux ou les tâches planifiées sur Windows) qui ira traiter, par exemple, un ensemble de fichiers déposés dans un répertoire.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    En utilisant le lien de wiztricks et celui-ci: An elegant way to run periodic tasks in python qui propose plusieurs solutions, j'ai testé ce code :

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    from threading import Timer
    import time
     
     
    def backup_data(delay):
        print("Exécution de la fonction à", time.ctime())
        Timer(delay, lambda: backup_data(delay)).start()
     
     
    backup_data(3)

    Et ça fonctionne bien (ici c'est toutes les 3 secondes, il suffit de passer 3600 en paramètre pour que ce soit toutes les heures)...

    Mais il y a des inconvénients, le lien indiqué ci-dessus en parle et propose d'autres solutions...

    EDIT : pas besoin de lambda :

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    from threading import Timer
    import time
    def backup_data(delay):
        print("Exécution de la function à", time.ctime())
        Timer(delay, backup_data, [delay]).start()
     
    backup_data(3)

  5. #5
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut


    On peut avoir l'heure correcte, tenant compte du fuseau horaire et de l'heure d'été, avec datetime et un affichage personnalisé dans la console avec termColor

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    from termcolor import cprint
    from threading import Timer
    from dateutil.tz import gettz
    import datetime as dt
     
    tzi = gettz("Europe/Brussels")
     
     
    def backup_data(delay):
        cprint("Exécution de la function à {}".format(dt.datetime.now(tzi).isoformat()), 'green')
        Timer(delay, backup_data, [delay]).start()
     
     
    backup_data(6)
    Nom : Console.PNG
Affichages : 201
Taille : 28,6 Ko

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  6. #6
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Ah oui c'est mieux avec de la couleur...
    J'ai essayé sous VS Code mais je n'ai pas d'affichage en couleur...

    Il faut que je vois ça...

  7. #7
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    Citation Envoyé par Beginner. Voir le message
    Ah oui c'est mieux avec de la couleur...
    J'ai essayé sous VS Code mais je n'ai pas d'affichage en couleur...

    Il faut que je vois ça...
    @Beginner : je travaille en VScode, la preuve :

    Nom : vscode.PNG
Affichages : 201
Taille : 112,2 Ko

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  8. #8
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Ah oui effectivement...
    Il doit me manquer quelque chose...

  9. #9
    Membre averti
    Homme Profil pro
    Reconversion
    Inscrit en
    Novembre 2018
    Messages
    502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Reconversion
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2018
    Messages : 502
    Points : 300
    Points
    300
    Par défaut
    Merci à toi beginner, j'ai oublié de mettre en résolu, mais ton code fonctionne très bien

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 09/05/2015, 16h33
  2. Problème pour modifier une fonction
    Par condor_01 dans le forum C
    Réponses: 5
    Dernier message: 05/11/2007, 23h03
  3. Problème pour tracer une fonction créneau
    Par Erzvinh dans le forum MATLAB
    Réponses: 8
    Dernier message: 02/02/2007, 16h53
  4. Réponses: 7
    Dernier message: 10/09/2005, 16h49
  5. [DLL] problème pour appeler une fonction d'une DLL
    Par bigboomshakala dans le forum MFC
    Réponses: 34
    Dernier message: 19/07/2004, 11h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo