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 :

Méthode _Thread__stop deprecated en python 3.2


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    863
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 863
    Par défaut Méthode _Thread__stop deprecated en python 3.2
    bonsoir,

    Il semble qu'en python 3.2 la méthode qui permettait de tuer un thread (module threading) soit "en disgrâce à la cour".

    Quelqu'un saurait-t-il quelle est sa remplaçante ?
    Ni la doc python ni google ne sont très verbeux.
    J'ai bien trouvé cela:
    http://pydoc.org/2.2.3/threading.html

    mais, ne fonctionne pas...

    Merci

  2. #2
    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,
    Les méthodes qui commencent par _ ou __ et qui ne sont pas documentées ne sont pas sensées être utilisées.
    Rien ne vous empêche d'aller lire les sources pour constater que le __stop a été remplacer par _stop...., ceci dit, le code ne fait peut être pas ce que vous voulez, car:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        def _stop(self):
            self._block.acquire()
            self._stopped = True
            self._block.notify_all()
            self._block.release()
    change l'état du thread mais ne sort pas de la méthode _run: vous avez l'impression que la thread est 'stop' mais elle continue de tourner.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    863
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 863
    Par défaut
    le code ne fait peut être pas ce que vous voulez
    J'en déduis d'une part, qu'il y a régression entre python 2.7 et 3.2.

    d'autre part que la FAQ de ce site
    http://python.developpez.com/faq/?pa...ead#ThreadKill
    est à mettre à jour à ce niveau.

    Comment stopper un thread bloqué sur un appel système ne gérant pas les time-out ?

  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
    Comment stopper un thread bloqué sur un appel système ne gérant pas les time-out ?
    Il n'y a pas de signal qui permette de faire sortir la thread du 'run' et donc de l'appel système... la méthode _stop ne permet pas de faire çà, elle vous donne juste l'illusion que çà l'a fait.
    Pour le cas général, il faut être pragmatique: fork, spawn,... en fonction de...
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    863
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 863
    Par défaut
    Dois-je en déduire que les process (bien que plus lourds) sont préférables aux threads si on désire la fonction "suppression" ?

  6. #6
    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,

    J'ai étudié quelques moyens pour arrêter les threads: http://python.jpvweb.com/mesrecettes...d=arret_thread, mais rien d'aussi solide qu'une méthode prédéfinie.

    Côté process, il faut regarder le module multiprocessing: il traite les process un peu comme les threads, y compris avec des partages de données. mais il y a un moyen de les arrêter (terminate). C'est un peu brutal, mais ça marche.

    Tyrtamos

  7. #7
    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 Bayard Voir le message
    Dois-je en déduire que les process (bien que plus lourds) sont préférables aux threads si on désire la fonction "suppression" ?
    La "suppression" a des implications qu'il faut apprécier correctement.

    Une des difficultés de toute solution générale est de réaliser que 'threads' signifient un état global (le même espace d'adressage) partagé entre plusieurs contextes d'exécution.

    Supprimer un de ces contextes de façon arbitraire peut laisser l'état global inconsistant rendant préférable le redémarrage de l'application. Pour éviter cela, la suppression doit être signalée au thread pour qu'elle puisse 'nettoyer' et non imposée...

    Dit autrement, le run doit pouvoir ressembler à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def run (self):
        try:
            # boulot de la thread
        except InterruptError: 
            # nettoyage
    1 => le "boulot de la thread" doit être "interruptible", ce qui n'est pas le cas de tous les appels systèmes.

    Comment réaliser InterruptError?

    Python n'est pas Java i.e. on n'écrit pas une VM qui réalise une abstraction d'OS indépendamment de ceux-ci mais basée sur les fonctionnalités qu'on retrouvera sur tout les OS. Et comme les fonctionnalités des API des signals ne sont pas homogènes, InterruptError n'est pas là.

    Note: vous avez néanmoins, en général, la possibilité d'interrompre le tread principal,, genre:
    thread.interrupt_main()¶

    Raise a KeyboardInterrupt exception in the main thread. A subthread can use this function to interrupt the main thread.
    Avec des process séparés, vous avez les signaux de type kill,... qui sont en général disponibles partout mais si vous passez par multiprocessing par exemple, vous avez construit un état 'global'....
    On sait réaliser InterruptError (via p.terminate) mais le boulot de nettoyage reste à faire...

    Ce boulot de nettoyage sera fonction des dépendances entre les différents contextes d'exécutions: si vous voulez être sûr de garantir la consistance de l'état global et des différents contextes qui devront "survivre", il faudra les limiter au moins pour celles qui dépendront des appels systèmes ou à une bibliothèque particulière....
    Vous vous rabattrez rapidement sur un modèle client/serveur: les appels seront effectués dans le contexte de serveurs dédiés à cela.
    Un main thread peut être signalé, la thread principale d'un programme multithread est généralement un bon candidat... d'autant que les appels "génants" sont rarement ré-entrants.

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

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

Discussions similaires

  1. Que faire si une méthode est deprecated
    Par yrtera dans le forum Android
    Réponses: 8
    Dernier message: 08/01/2014, 11h52
  2. Réponses: 0
    Dernier message: 02/07/2009, 15h38
  3. Méthode deprecated et infos bulles
    Par JohnNC dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 08/02/2007, 12h49
  4. [Deprecated] Méthode setCursor()
    Par michaeljeru dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 07/12/2006, 11h01
  5. Méthodes privées: pratique courant en Python
    Par Thierry Chappuis dans le forum Général Python
    Réponses: 3
    Dernier message: 25/11/2005, 19h30

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