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 :

Optimiser mes premiers threads


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 16
    Par défaut Optimiser mes premiers threads
    Bonjour,

    Après pas mal de difficultées j'ai enfin un début de progamme qui quitte proprement mes threads.

    Avant de les étoffer j'aimerais avoir votre avis afin d'optimiser ce petit programme qui me paraît un peu touffu.

    code appelé AffThread4 :
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    import threading
    import datetime
    import random
    import time
    import sys
    import RPi.GPIO as GPIO #++
     
    end=''
     
    GPIO.setmode(GPIO.BCM) #++ GPIO21= broche 40
    GPIO.setup(20, GPIO.OUT, initial=GPIO.LOW)# broche 38 LED #++
     
    class Afficheur(threading.Thread):
     
        """Thread chargé simplement d'afficher une lettre dans la console."""
     
        def __init__(self, lettre):
            threading.Thread.__init__(self)
            self.lettre = lettre
            self.end = True
     
        def run(self):
            """Code à exécuter pendant l'exécution du thread."""
            i = 0
            print('end2=',self.end)
            while (i < 20) & self.end == True:
    #            sys.stdout.write(self.lettre)
    #            sys.stdout.flush() # affichage immediat
                print(self.lettre)
                attente = 0.2
                attente += random.randint(1, 60) / 100 # attente aleatoire de 0.2 a 0.8 s
                time.sleep(attente)
                i += 1
                print('end2 ',self.end)
                if self.end  == False:
                    break
     
        def stop(self):
            print("Fin Afficheur !")
            self.end = False
    # fin de Afficheur
     
    class Compteur(threading.Thread):
        """ Fait clignoter une led """
        def __init__(self):
            threading.Thread.__init__(self)
            self.end = True
     
        def run(self):
            i = 0
            date=datetime.datetime.now() #*-*
            second_old=date.second+1 #*-*
            while self.end == True:
                try:
                    date=datetime.datetime.now() #*-*
                    secs=int(date.second) #*-*
                    Led=date.microsecond/1E6
        # commande de la LED toute les secondes (0.5s allumee, 0.5s eteinte)
                    if  Led>=0.5:
                        GPIO.output(20,GPIO.LOW)# LED  allumee #++
                        pass # equiv a nop
                    else:
                        GPIO.output(20,GPIO.HIGH)# LED eteinte #++
                        pass # equiv a nop                
                    if secs==second_old:
                        i+=1
                        print('secs->',secs) #*/*
                        second_old+=1  
                        if second_old==60: 
                            second_old=0
                except RuntimeError:
                    self.end = False
                    GPIO.cleanup()
     
        def stop(self):
            print("Fin Compteur !")
            self.end = False
    code appelant:
    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 AffThread4
     
    end=True
    thread1=AffThread4.Compteur()
    thread2 =AffThread4.Afficheur('A')
    print("Entrez M pour marche")
    print("  ou   A  pour arrêt   ")
    Fin=1
    while Fin:
        try:
            choix=input("Choix :")
            time.sleep(0.1)
            choix=choix.upper()
            print('choisi->',choix)
            if choix=='M':
                end=True
                thread1.start()
                thread2.start()
            if choix== 'A':
                end=False
                thread1.stop()
                thread2.stop()
                Fin=0
        except KeyboardInterrupt:
            thread1.join()
            thread2.join()
     
    if Fin==0:
        thread1.join()
        thread2.join()
    Vos avis me seraient très utiles
    Merci d'avance
    Cordialement

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 699
    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 699
    Par défaut
    Salut,

    Citation Envoyé par mandrain Voir le message
    Avant de les étoffer j'aimerais avoir votre avis afin d'optimiser ce petit programme qui me paraît un peu touffu.
    Qu'entendez vous par optimiser: écrire plus succinctement?

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

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 16
    Par défaut
    Bonjour,

    J'entends par là éliminer les parties inutiles ou redondantes du programme (a part les 'print' qui ne servent qu'à vérifier si le chemin suivi est correcte).

    C'est ma première application des threads et il me semble que c'est bien touffu.
    Ai-je bien compris comment les arrêter ou peut on bien mieux faire.

    Merci d'avance
    Cordialement

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 699
    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 699
    Par défaut
    Citation Envoyé par mandrain Voir le message
    J'entends par là éliminer les parties inutiles ou redondantes du programme (a part les 'print' qui ne servent qu'à vérifier si le chemin suivi est correcte).
    Quand je lis:

    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
        def run(self):
            i = 0
            date=datetime.datetime.now() #*-*
            second_old=date.second+1 #*-*
            while self.end == True:
                try:
                    date=datetime.datetime.now() #*-*
                    secs=int(date.second) #*-*
                    Led=date.microsecond/1E6
        # commande de la LED toute les secondes (0.5s allumee, 0.5s eteinte)
                    if  Led>=0.5:
                        GPIO.output(20,GPIO.LOW)# LED  allumee #++
                        pass # equiv a nop
                    else:
                        GPIO.output(20,GPIO.HIGH)# LED eteinte #++
                        pass # equiv a nop                
                    if secs==second_old:
                        i+=1
                        print('secs->',secs) #*/*
                        second_old+=1  
                        if second_old==60: 
                            second_old=0
                except RuntimeError:
                    self.end = False
                    GPIO.cleanup()
    J'ai plusieurs questions:
    1. pourquoi une boucle qui consomme beaucoup de CPU alors qu'elle devrait pouvoir attendre que 0.5 secondes ait passé avant de changer l'état des LEDS? Est-il vraiement utile de faire un appel à GPIO.output à chaque itération?
    2. pourquoi récupérer des secondes via datetime.now() alors que time.time serait bien plus direct?
    3. A quoi sert le "i" (sachant que le reste est peut être du debug)...?


    Après côté Thread, la synchronisation doit se faire via Event même si l'implémentation de Python que vous utilisez "fonctionne" en utilisant une simple variable (et je vous avais posté un exemple d'utilisation tantôt)... Mais vous avez bien d'autres problèmes à résoudre.

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

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 16
    Par défaut
    La boucle est là justement pour occuper le CPU afin de créer, pour le test, les conditions de multiples class et ou fonctions

    Le GPIO peut effectivement être simplement inversé mais ce n'est pas l'objet de ce test.
    En réalité ce ne serait pas 'datetime' ni ' time' qui serait utilisé mais un horodateur afin qu'une horloge sauvegardée par pile assure les fonctions de date et d'heure avec ou sans connexion internet et 'en même temps' une éventuelle absence de secteur. Cette fonction n'est pas significative car elle ne sert qu'à démontrer l'activité de ce thread. Néanmoins il me semble bien qu'elle pourrait être simplifiée.

    Le "i" est un reste oublié. Il n'a effectivement rien à faire ici.

    Je pensais à l'optimisation des conditions d'arrêts des threads dans les boucles while avec les conditions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while ..
         try:
         except ...:
    et les instructions comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	thread.stop()
    	thread.join()
    En clair l'utilisation des instructions " .join()" qui me semblent redondantes et qui si elles ne sont pas là, font que les threads ne s'arrêtent pas.

    C'est pour çà que je craint que mon raisonnement soit un peu confus.

    Merci de votre attention
    Cordialement

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 699
    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 699
    Par défaut
    Citation Envoyé par mandrain Voir le message
    Le GPIO peut effectivement être simplement inversé mais ce n'est pas l'objet de ce test.
    Si c'est un programme qui vous sert juste à tester 2/3 idées, pas la peine de vouloir l'optimiser...

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

  7. #7
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 16
    Par défaut
    La boucle est là justement pour occuper le CPU afin de créer, pour le test, les conditions de multiples class et ou fonctions

    Le GPIO peut effectivement être simplement inversé mais ce n'est pas l'objet de ce test.
    En réalité ce ne serait pas 'datetime' ni ' time' qui serait utilisé mais un horodateur afin qu'une horloge sauvegardée par pile assure les fonctions de date et d'heure avec ou sans connexion internet et 'en même temps' une éventuelle absence de secteur. Cette fonction n'est pas significative car elle ne sert qu'à démontrer l'activité de ce thread. Néanmoins il me semble bien qu'elle pourrait être simplifiée.

    Le "i" est un reste oublié. Il n'a effectivement rien à faire ici.

    Je pensais à l'optimisation des conditions d'arrêts des threads dans les boucles while avec les conditions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while ..
        try:
        except ...:
    et les instructions comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	thread.stop()
    	thread.join()
    En clair l'utilisation des instructions " .join()" qui me semblent redondantes et qui si elles ne sont pas là, font que les threads ne s'arrêtent pas.

    C'est pour çà que je craint que mon raisonnement soit un peu confus.

    Merci de votre attention
    Cordialement

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 13/02/2008, 11h19
  2. mes premiers pas
    Par meddeb2001 dans le forum WinDev
    Réponses: 1
    Dernier message: 15/01/2007, 12h06
  3. Réponses: 6
    Dernier message: 02/03/2006, 07h39
  4. [CF][C#] Comment optimiser mes requêtes avec SqlCE ?
    Par david71 dans le forum Windows Mobile
    Réponses: 10
    Dernier message: 20/01/2006, 14h48
  5. Mes premiers débuts avec Dev-C++ : ca bloque !
    Par fab56 dans le forum Dev-C++
    Réponses: 6
    Dernier message: 20/02/2005, 16h24

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