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 :

stop thread principal


Sujet :

Python

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    541
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 541
    Points : 124
    Points
    124
    Par défaut stop thread principal
    Bonjour,

    Je lance mon script python via un bash script sous linux, mais je souhaiterais lorsque je souhaite stopper son exécution, par conséquent je passe par un fichier auquel j'écris le mot Close pour arrêter le programme script.py mais je constate que cela stop uniquement le Thread et non le Thread principal (While True)malgré le sys.exit(0).

    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
    from time import sleep
    import sys
    import os
    import threading
    from _thread import interrupt_main
     
    from timed_count import timed_count
     
    class MyThreadReadUpdate (threading.Thread):
        def __init__(self):
            threading.Thread.__init__(self)
            self._running = True        
     
     
        def terminate(self):
            self._running = False
     
        def run(self):
            while self._running:
     
                #print("MyThreadReadUpdate is running")  
                if os.path.exists(sys.argv[2]):                      
                    f3 = open(sys.argv[2], "r+")
                    valueToDo=f3.readline().rstrip()
                    #print(valueToDo+"/")
                    if (valueToDo == "Close" ):
                        print("Exiting program is asked by user")
     
                        sleep(2)
                        f3.seek(0);
                        f3.write("Nothing")
                        f3.close()
                        sys.exit(0)
     
                    else:
                        #print("run always this program") 
                        f3.close()
                #time.sleep(5) 
     
     
    readUpdate_Thread = MyThreadReadUpdate()
    readUpdate_Thread.daemon = True    
    readUpdate_Thread.start()
     
     
    while True:
         print("loop")
         sleep(3)
    Sauriez-vous me dire comment procéder svp?

    Merci d'avance.

  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
    Un peu de recherche sur Internet vous saurait suggérer d'utiliser os._exit() (à la place de sys.exit()).
    Mais à la base, si le while doit sortir lorsque le thread est terminé, autant faire un join avec timeout.

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

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    541
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 541
    Points : 124
    Points
    124
    Par défaut
    Il y a différente proposition mais c'est comme chercher une aiguille dans une botte de foin, qu'entendez-vous d'un join avec timeout cela permettra à ce que le while True s'arrête automatiquement?

  4. #4
    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
    Je vous ai indiqué os._exit() à la place de sys.exit(). Ca ne vous convient pas?

    Après pour utiliser (thread).join(timeout), commencer par lire la documentation (qui a été traduite en français) et tester pour voir si on a compris ce que ça dit pour en faire quelque chose.

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

  5. #5
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 104
    Points : 4 454
    Points
    4 454
    Par défaut
    bonjour

    Mais pourquoi ne pas utiliser les services système d ? Cela éviterait d'avoir à écrire une tache dans ton script python !

    par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # fichier: ~/.config/systemd/user/pytest.service
    [Unit]
    Description=Python daemon
     
    [Service]
    Type=simple
    ExecStart=/home/moi/python/service-systemd/service.py 
    KillSignal=SIGTERM
    TimeoutStopSec=10
    KillMode=process
     
    [Install]
    WantedBy=multi-user.target
    On lance/arrête donc le script python en tache de fond (dans ton script ou ligne de commande) avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    systemctl start pytest.service --user
    systemctl stop pytest.service --user
    A noter que dans cet exemple, la commande stop envoi le signal SIGTERMReste à l'intercepter dans python et le traiter :
    - sortie immédiate
    - ou sortie à la fin d'une boucle pour ne rien casser du travail en cours :

    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
    #!/usr/bin/env python
     
    RUN = True
     
    def signal_handler(signal_num, frame):
        global RUN
        print(f"Recu depuis l'extérieur le Signal  {signal_num}!")
        RUN = False
        print("on attend la fin d'un cycle")
        #sys.exit()  Ou si on désire sortir immédiatement
     
    signal.signal(signal.SIGTERM, handler=signal_handler)
     
    while True:   # plutot while RUN:
        ...   # travail
        if not RUN:
            break
    ps: sans systemd, il est possible de récupérer le pId et a la fin du script bash faire un kill -s TERM pId
    $moi= ( !== ) ? : ;

  6. #6
    Membre expérimenté
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    870
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 870
    Points : 1 522
    Points
    1 522
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par papajoker Voir le message

    ps: sans systemd, il est possible de récupérer le pId et a la fin du script bash faire un kill -s TERM pId
    Bonjour,
    soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    kill -s TERM $(pgrep -f "python3 nom_du_prog.py")
    #Rien de nouveau sous le soleil, tout est vanité comme courir après le vent!
    Developpement pour Android avec Python3/Kivy/Buildozer

Discussions similaires

  1. [C++/CLI] Méthode cyclique dans thread principal
    Par Plio dans le forum C++/CLI
    Réponses: 4
    Dernier message: 09/10/2007, 15h19
  2. utiliser un thread séparé et revenir au thread principal
    Par k6971 dans le forum EDT/SwingWorker
    Réponses: 5
    Dernier message: 19/09/2007, 11h42
  3. appel asynchrone dans le thread principal
    Par mrrenard dans le forum C#
    Réponses: 6
    Dernier message: 05/04/2007, 09h07
  4. [Thread]thread principal et autres thread.
    Par david06600 dans le forum Concurrence et multi-thread
    Réponses: 5
    Dernier message: 19/12/2006, 15h59
  5. Réponses: 1
    Dernier message: 19/05/2006, 09h24

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