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 :

conseil pour programmation d'une tâche répétitive et utilisation CPU


Sujet :

Python

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 62
    Points : 43
    Points
    43
    Par défaut conseil pour programmation d'une tâche répétitive et utilisation CPU
    Bonjour

    je débute en python et j'ai besoin d'un conseil sur la méthode à utiliser.

    J'ai, sur un Raspberry Pi 2, une base de données qui s'alimente régulièrement (positions géographiques de traceurs GPS) et je souhaite créer un script qui lise cette base de données MySQL une fois par seconde pour aller créer un fichier texte avec la dernière position GPS d'un mobile.

    Mon idée est de créer le script (je sais le faire) et d'attendre une seconde grâce à time.sleep(1.0) jusqu'à l'exécution suivante. Je souhaite que ce script soit actif en permanence 24/7

    Voici ma question : est-ce que ce time.sleep() va utiliser toutes les ressources systeme pendant ce temps d'attente ? (et par conséquent empècher java de faire son boulot pendant ce temps pour les autres parties du logiciel)

    Question subsidiaire : une meilleure idée pour faire ça ?

    Merci à tous

  2. #2
    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 flyjodel Voir le message
    Voici ma question : est-ce que ce time.sleep() va utiliser toutes les ressources systeme pendant ce temps d'attente ? (et par conséquent empècher java de faire son boulot pendant ce temps pour les autres parties du logiciel)
    time.sleep place le processus courant dans un état d'attente. Tant qu'il ne sort pas de cet état, il consommera pas ou peu de CPU mais occupera toujours de la mémoire.

    Citation Envoyé par flyjodel Voir le message
    J'ai, sur un Raspberry Pi 2, une base de données qui s'alimente régulièrement (positions géographiques de traceurs GPS) et je souhaite créer un script qui lise cette base de données MySQL une fois par seconde pour aller créer un fichier texte avec la dernière position GPS d'un mobile.
    Pourquoi créer un fichier texte? La (ou les) dernière(s) entrée(s) dans la base de donnée devrai(en)t pouvoir être récupérée(s) avec la requête SQL qui va bien.

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

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 62
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,
    time.sleep place le processus courant dans un état d'attente. Tant qu'il ne sort pas de cet état, il consommera pas ou peu de CPU mais occupera toujours de la mémoire.
    Merci, cela répond parfaitement à ma question. Je consomme très peu de mémoire, donc ce ne sera pas un problème (seulement quelques octects, moins de 50 ou 100 je pense)
    Citation Envoyé par wiztricks Voir le message
    Pourquoi créer un fichier texte? La (ou les) dernière(s) entrée(s) dans la base de donnée devrai(en)t pouvoir être récupérée(s) avec la requête SQL qui va bien.
    Parce que mon fichier texte sera un fichier KML qui sera placé dans le répertoire /var/www/ et accessible en direct depuis Google Earth

    Merci de ta réponse, et bonne journée !
    M

  4. #4
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,

    un time.sleep() utilisé brutalement fait le job mais les données obtenues seront simplement séparées d'environ une seconde, sans aucune précision, avec un décalage non négligeable. Il est plus judicieux de se caler sur le changement de seconde par exemple (function waitNextSecond)

    A+

    Pfeuh

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    import time
    import sys
    import random
     
    def waitOneSecond():
        # on attend environ une seconde
        next_second = float(int(time.time() + 1.0))
        while time.time() < next_second:
            time.sleep(1.0)
     
    def waitNextSecond(granularity=0.02):
        # on attend la prochaine seconde
        next_second = float(int(time.time() + 1.0))
        while time.time() < next_second:
            time.sleep(granularity)
     
    def mainTask():
        # duree indeterminee
        for x in range(random.randint(0,200000)):
            dummy = " "*x
     
    for x in range(10):
        mainTask()
        waitOneSecond()
        print("%.03f "%time.time())
     
    print "Un petit peu plus precis..."
     
    while 1:
        mainTask()
        waitNextSecond()
        print("%.03f "%time.time())

  5. #5
    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 pfeuh Voir le message
    un time.sleep() utilisé brutalement fait le job mais les données obtenues seront simplement séparées d'environ une seconde, sans aucune précision, avec un décalage non négligeable. Il est plus judicieux de se caler sur le changement de seconde par exemple (function waitNextSecond)
    Il va juste lire le dernier enregistrement fait en base de donnée, la précision c'est plutôt pour l'engin qui renseigne la base: à la lecture le dernier sera toujours le dernier.

    Citation Envoyé par flyjodel Voir le message
    Parce que mon fichier texte sera un fichier KML qui sera placé dans le répertoire /var/www/ et accessible en direct depuis Google Earth
    /var/www/ signifie que le contenu du fichier sera retourné par une requête HTTP. Rien ne vous empêche de construire ce contenu à la réception de la requête. Dans ce cas, plus besoin de fabriquer toutes les secondes une information qui ne sera peut être jamais utilisée ni de créer une tâche qui tourne 24/24 pour pas grand chose.

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

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 62
    Points : 43
    Points
    43
    Par défaut
    Bonsoir, merci à tous les deux.

    Citation Envoyé par wiztricks Voir le message
    /var/www/ signifie que le contenu du fichier sera retourné par une requête HTTP. Rien ne vous empêche de construire ce contenu à la réception de la requête. Dans ce cas, plus besoin de fabriquer toutes les secondes une information qui ne sera peut être jamais utilisée ni de créer une tâche qui tourne 24/24 pour pas grand chose.
    En effet, je veux bien construire ce contenu lors de la réception de la requête, mais là, je n'ai aucune idée pour commencer ça. Comment détecter qu'un accès est demandé sur le port 80, concernant tel fichier ? puis construire le fichier et le renvoyer ?

    De plus, les requêtes le seront lors d'évènements sportifs, donc il se pourra qu'entre 10 et 100 requêtes soient faites simultanément, à chaque seconde, il faudrait alors gérer la question suivante : le fichier a-t-il déjà été créé lors de la seconde actuelle ? si oui, le renvoyer, sinon le créer et le renvoyer

    En réalité, le mieux serait de créer ce fichier en Java, directement depuis le programme qui récupère les données externes, mais je ne sais pas le faire et ce petit module python semble bien correspondre à mes capacités...

  7. #7
    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
    Citation Envoyé par flyjodel Voir le message
    En effet, je veux bien construire ce contenu lors de la réception de la requête, mais là, je n'ai aucune idée pour commencer ça. Comment détecter qu'un accès est demandé sur le port 80, concernant tel fichier ? puis construire le fichier et le renvoyer ?
    C'est dans la magie de la configuration du serveur web que vous utilisez.

    Citation Envoyé par flyjodel Voir le message
    De plus, les requêtes le seront lors d'évènements sportifs, donc il se pourra qu'entre 10 et 100 requêtes soient faites simultanément, à chaque seconde, il faudrait alors gérer la question suivante : le fichier a-t-il déjà été créé lors de la seconde actuelle ? si oui, le renvoyer, sinon le créer et le renvoyer
    Le fichier a une date de création, çà se teste. Mais si vous créez les données à la volée, vous n'êtes même pas obligé de créer un fichier, le serveur web dispose d'un cache souvent en mémoire dans lequel on peut stocker des données et un timestamp.

    Citation Envoyé par flyjodel Voir le message
    En réalité, le mieux serait de créer ce fichier en Java, directement depuis le programme qui récupère les données externes, mais je ne sais pas le faire et ce petit module python semble bien correspondre à mes capacités...
    Java n'est peut être pas le meilleur langage pour effectuer une opération déclenchée par le serveur Web.
    Mais je ne voulais qu'essayer de répondre à votre question initiale:
    Citation Envoyé par flyjodel Voir le message
    Question subsidiaire : une meilleure idée pour faire ça ?
    qui ne mentionnait pas le "pourquoi" vous vouliez réaliser cela.

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

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 62
    Points : 43
    Points
    43
    Par défaut
    merci à tous,

    grâce à votre aide, j'ai réussi à terminer la première phase de mon projet, qui fonctionne !
    Il ne reste plus qu'à rajouter des fonctionnalités, des appels externes au lieu de choses programmées en dur, et un peu d'interface. Mais ça tourne.

    J'ai utilisé cette syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def waitOneSecond():
        # on attend environ une seconde
        next_second = float(int(time.time() + 1.0))
        while time.time() < next_second:
            time.sleep(1.0)
     
    # def mainTask():
        # # duree indeterminee
    .....
     
    while 1:
        mainTask()
        waitOneSecond()
        print("%.03f "%time.time())
    ce code me convient car il me permet de constater qu'avec un RPi 2, le temps d'exécution de la fonction mainTask() est de 12 ms environ.
    Il faut que je teste maintenant avec plusieurs requêtes pour voir si ce temps augmente proportionnellement ou si j'arrive à l'optimiser pour suivre non pas un, mais une centaine de trackers.

    Merci à vous !

    ps : l'idée de le programmer en JAVA n'est pas de moi, mais le projet initial est déjà rédigé en JAVA et je l'utilise tel quel. Je ne fais que rajouter un module en python pour y ajouter une fonctionnalité.
    Je pense qu'il serait beaucoup plus simple de le programmer aussi en JAVA pour intégrer ce module au git et ne pas être dépendant de l'installation de telle ou telle version de python, avec tous les problèmes de variables d'environnement que cela peut poser. Mais une chose après l'autre pour mes compétences limitées...

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

Discussions similaires

  1. Demande de conseils pour me faire une config gamer à 1000€
    Par julien06 dans le forum Ordinateurs
    Réponses: 3
    Dernier message: 20/11/2007, 22h32
  2. [Mobile] Petit conseil pour programmer sur un Nokia N70
    Par GarulfoLinux dans le forum Mobiles
    Réponses: 8
    Dernier message: 09/03/2007, 11h41
  3. Conseils pour choix d'une version SQL Server
    Par lp38 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 07/08/2006, 19h57
  4. Conseils pour re-développer une application "old school"
    Par delphi5user dans le forum Delphi
    Réponses: 1
    Dernier message: 10/07/2006, 17h53
  5. Réponses: 19
    Dernier message: 10/05/2006, 09h40

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