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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 062
    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 062
    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
    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'

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    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

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    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 062
    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.

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    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

  7. #7
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    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 062
    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

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    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

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