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 :

Multiprocessing Capture Signaux


Sujet :

Python

  1. #1
    Membre du Club
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    décembre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : décembre 2008
    Messages : 48
    Points : 65
    Points
    65
    Par défaut Multiprocessing Capture Signaux
    Bonjour,

    Je m'amuse toujours avec le multiprocessing, et je tente maintenant de le tuer convenablement (même les process ont le droit à une belle mort).

    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
    from multiprocessing import Process,Pool,Queue
    import time
     
    def f(Multi_Queue):
        while not Multi_Queue.empty():
            name=Multi_Queue.get()
            print 'hello', name
            time.sleep(4)    
        print 'bye', name
     
     
    #if catch ctrl+c
    def signal_handler(signal,frame):
        '''
        if it catch any ctrl+c it try to finish correctly
        '''
        print '''please wait during the programme end'''
        p.terminate()
        exit()
     
     
    if __name__ == '__main__':
     
          signal.signal(signal.SIGINT, signal_handler)
          Test_Queue=Queue()
          Test_Queue.put('jeanne')
          p = Process(target=f, args=(Test_Queue,))
          p.start()
          p.join()
    Je lance donc un process et si vient un ctrl+c je veux ecrire une chaine de caractère avant.
    Cependant avec ce code, le main comprend bien la chose, mais le process tente de faire pareil (et de s'auto-tuer) ce qui fait planter le programme.

    Aussi quelqu'un connait il un moyen de terminer ca joliement sans un vilain message d'erreur à la fin ?


    EDIT : toujours python 2.7 sous Debian Lenny

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    bonjour,

    ce programme ne donne pas de message d'erreur chez moi (Ubuntu 10.10, python 2.6.6):


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    hello jeanne
    ^Cplease wait during the programme end
    please wait during the programme end
    Maintenant, je ne sais pas si c'est le résultat que tu attends :p

  3. #3
    Membre du Club
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    décembre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : décembre 2008
    Messages : 48
    Points : 65
    Points
    65
    Par défaut
    Et bien il entre deux fois dans la boucle de fin c'est pas cool

    parce que si ensuite tu remplaces le terminate par un join donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #if catch ctrl+c
    def signal_handler(signal,frame):
        '''
        if it catch any ctrl+c it try to finish correctly
        '''
        print '''please wait during the programme end'''
        p.join()
        exit()
    le fils tente de se joindre et il est pas content ....

    (c'était une erreur de ma part de pas avoir mis le join directement j'avoue )

  4. #4
    Membre du Club
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    décembre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : décembre 2008
    Messages : 48
    Points : 65
    Points
    65
    Par défaut
    Bon comme je m'aime beaucoup je vais m'auto aider /o/

    en vérifiant le PID du process on peut savoir s'il s'agit du main ou pas

    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
    from multiprocessing import Process,Pool,Queue
    import time
    import os
     
    def f(Multi_Queue):
        while not Multi_Queue.empty():
            name=Multi_Queue.get()
            print 'hello', name
            time.sleep(4)    
        print 'bye', name
     
     
    #if catch ctrl+c
    def signal_handler(signal,frame):
        '''
        if it catch any ctrl+c it try to finish correctly
        '''
        if os.getpid()==PID:
          print '''please wait during the programme end'''
          p.terminate()
          exit()
     
     
    if __name__ == '__main__':
     
          Main_PID=os.getpid()
          signal.signal(signal.SIGINT, signal_handler)
          Test_Queue=Queue()
          Test_Queue.put('jeanne')
          p = Process(target=f, args=(Test_Queue,))
          p.start()
          p.join()
    ca marche pour le process et ca fait presque ce que je veux. (il saute le sleep mais ca c'est une autre histoire )

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    Bonjour,

    par curiosité j'ai testé le code du premier post sous Windows, je m'attendais à un comportement légèrement différent et effectivement:

    Les deux process reçoivent le signal (comme sous linux visiblement), mais seul le parent exécute le signal handler (le fils reçoit une exception KeyboardInterrupt).

    J'image que la création de process est implémenté par un fork sous linux et que le processus fils hérite donc du signal handler. Une solution serait alors de déplacer l'installation du handler après la création du processus fils, ou d'installer un autre handler dans le processus fils lui-même. Mais la solution actuelle (tester le PID dans le handler) convient aussi bien sûr.

  6. #6
    Membre du Club
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    décembre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : décembre 2008
    Messages : 48
    Points : 65
    Points
    65
    Par défaut
    Bonjour,

    Lancer la capture de signal après le création des process j'y avais pensé mais c'était pas terrible tout de même. (surtout que je créer des process en boucle)

    Par contre un autre handler c'est génial je n'y avais pas pensé /o/

    merci bien.

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 22/10/2009, 13h23
  2. [Amstrad] Signaux à gérer port E/S pour lire ROM
    Par Masterglob dans le forum Autres architectures
    Réponses: 7
    Dernier message: 12/01/2005, 12h03
  3. Réponses: 10
    Dernier message: 10/10/2003, 14h25
  4. Capture d image par webcam
    Par moimoimoi3x dans le forum C++Builder
    Réponses: 7
    Dernier message: 03/07/2003, 08h48
  5. Réponses: 3
    Dernier message: 01/11/2002, 14h30

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