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 :

[Kill] un thread bloquant


Sujet :

Python

  1. #1
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Par défaut [Kill] un thread bloquant
    Bonjour
    j'ai un thread bloquant qui attend une entrée clavier
    comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class KeyboardThread(threading.Thread):
     
        def __init__(self, input_cbk = None, name='keyboard-input-thread'):
            self.input_cbk = input_cbk
            super(KeyboardThread, self).__init__(name=name)
            self.start()
     
        def kill(self):
            os.kill(self.native_id, signal.SIGKILL)
     
        def run(self):
            cont = True
            while cont:                      
                cont = self.input_cbk(input()) # waits to get input + Return
    et j'aimerais savoir si il existe un moyen simple de l'arreter ...
    j'ai bien tenté une fonction kill mais la ca arrete tt le monde

    je sais qu'en passant par un process a la place on aurait sans doute pas ce problème ...
    mais y'a t'il une autre solution en gardant le thread ?

    voici mon programme de test
    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 os
    import signal
    import sys
    import threading, multiprocessing
    from utils.KeyboardThread import KeyboardThread
     
    shutdown = False
     
    def keyboradStop(inp):
        if inp == "quit":               
            print('Arret demandé (clavier quit)')
            global shutdown
            shutdown = True
            return True
        else:
            return True
     
    #--------------------------------------------------------------------------------
    # Main
    #--------------------------------------------------------------------------------
    if __name__ == '__main__':
        print("--------------------------------------------------------------")
        print(f" Test ") 
        print("--------------------------------------------------------------")
        k = KeyboardThread(keyboradStop)
        while not shutdown:
            time.sleep(1)
        print("--------------------------------------------------------------")    
        #k.kill()
        print("-voila la veritable fin---------------------------------------")
        print("sample")

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 032
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 032
    Par défaut
    L'objet Thread a sa propre méthode kill, pourquoi utiliser os.kill ?

    PS : Pour être plus clair, la méthode stop permet de faire cela, sinon un autre moyen est de créer un flag qui permet d'exprimer si le Thread est fonctionnel ou stoppé.

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

    Citation Envoyé par ikeas Voir le message
    j'ai un thread bloquant qui attend une entrée clavier
    Vous avez 2 solutions: récupérer une bibliothèque qui permette d'avoir des saisies claviers non-bloquantes et/ou effectuer les saisies claviers dans le thread principal (qui généralement reçoit les signaux).
    Et tout cela n'a rien à voir avec la programmation Python car threads et entrées sorties se font via l'environnement système (qu'il faut connaître).

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

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    L'objet Thread a sa propre méthode kill, pourquoi utiliser os.kill ?

    PS : Pour être plus clair, la méthode stop permet de faire cela, sinon un autre moyen est de créer un flag qui permet d'exprimer si le Thread est fonctionnel ou stoppé.
    j'ai tenté d'enlever mon kill (je suis en python 3.8)
    mais ca me donne ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Une exception s'est produite : AttributeError
    'KeyboardThread' object has no attribute 'kill'
      File "/opt/clemessy/cycounter/app/test.py", line 32, in <module>
        k.kill()
    AttributeError: 'KeyboardThread' object has no attribute 'kill'

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 679
    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 679
    Par défaut
    Citation Envoyé par ikeas Voir le message
    j'ai tenté d'enlever mon kill (je suis en python 3.8)
    kill et stop ne sont pas des méthodes des threads (de la bibliothèque standard Python).

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

  6. #6
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 032
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 032
    Par défaut
    Citation Envoyé par ikeas Voir le message
    j'ai tenté d'enlever mon kill (je suis en python 3.8)
    mais ca me donne ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Une exception s'est produite : AttributeError
    'KeyboardThread' object has no attribute 'kill'
      File "/opt/clemessy/cycounter/app/test.py", line 32, in <module>
        k.kill()
    AttributeError: 'KeyboardThread' object has no attribute 'kill'
    Oui je me suis planté avec la méthode _stop mais du coup qu'il ne faudrait pas utiliser directement, je ne l'utilise jamais, désolé...

    Par contre dans mes quelques lectures, je pense que l'objet Event peut être utile pour ton besoin.

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 679
    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 679
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Par contre dans mes quelques lectures, je pense que l'objet Event peut être utile pour ton besoin.
    Il faut arrêter les âneries là: input étant bloquant, impossible de boucler pour tester une condition réalisée via Event ou n'importe quoi d'autre.

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

  8. #8
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 032
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 032
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Il faut arrêter les âneries là: input étant bloquant, impossible de boucler pour tester une condition réalisée via Event ou n'importe quoi d'autre.
    Pour arrêter un Thread, Event me semble adapté, mais je peux me tromper... je ne l'utilise pas ! Par contre je n'ai absolument pas visualiser le code, je parlais de manière générale sur le Thread, l'interprétation semble être toute autre...

    J'ai aussi parler de flag, ça me semble pas non plus une ânerie, je pensais à quelque chose d'assez simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def run(self):
        while self.running:
            # suite
     
    def stop(self):
        self.running = False

    Après j'en ai dis, mais pas tant que ça j'espère

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 679
    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 679
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    je parlais de manière générale sur le Thread, l'interprétation semble être toute autre...
    La question posée disait: "j'ai un thread bloquant qui attend une entrée clavier".
    Après on peut discuter de manière générale des Threads, mais c'est un autre sujet.

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

  10. #10
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour

    C'est un problème connu. Avec Python, à ma connaissance (et d'après la doc!), il n'existe aucune méthode permettant d'arrêter un thread avant sa fin normale (mais ça existe cependant avec les threads de PyQt5). Quand l'exécution du thread comporte une boucle, on peut toujours introduire un drapeau qui permet l'arrêt de la boucle, mais avec input, ça ne va plus. Il existe des propositions de solution sur le web (chercher "python threading kill input"), mais c'est du bricolage. On peut, par exemple, remplacer le input par une saisie caractère par caractère (jusqu'au "\n"), ce qui permet de retrouver une boucle, et donc une possibilité d'arrêt avant la fin normale avec un drapeau, mais ça n'est plus "multi-OS".

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    C'est un problème connu....., mais ça n'est plus "multi-OS".
    En effet je pensais naïvement qu'on pouvait killer a un thread a l'arrache lol

  12. #12
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 679
    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 679
    Par défaut
    Citation Envoyé par ikeas Voir le message
    En effet je pensais naïvement qu'on pouvait killer a un thread a l'arrache lol
    On peut le faire.... mais c'est tellement délicat (côté conséquences à gérer/éviter) qu'il n'y a pas d'interface pour qu'un programmeur lambda puisse jouer avec.
    Reste à apprendre à programmer plus proprement.

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

  13. #13
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 304
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    ..

    J'ai aussi parler de flag, ça me semble pas non plus une ânerie, je pensais à quelque chose d'assez simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def run(self):
        while self.running:
            # suite
     
    def stop(self):
        self.running = False
    Ce qui est effectivement la meilleure solution.

Discussions similaires

  1. Thread Bloquant & TcpClient
    Par Invité dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 04/09/2010, 17h42
  2. [MFC] Thread bloquant et sockets
    Par wogkiller dans le forum Threads & Processus
    Réponses: 8
    Dernier message: 09/06/2008, 15h37
  3. Thread bloquant, pourquoi ?
    Par ILoveCSharp dans le forum C#
    Réponses: 5
    Dernier message: 16/06/2007, 22h11
  4. [Threads] Sortir d'une fonction bloquante
    Par guejo dans le forum MFC
    Réponses: 19
    Dernier message: 17/08/2004, 14h12
  5. [API] Communication série NON-bloquante : OVERLAPPED/Thread
    Par Rodrigue dans le forum C++Builder
    Réponses: 2
    Dernier message: 07/11/2003, 13h43

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