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 :

[threading][logging] erreur de loggage dans un thread


Sujet :

Python

  1. #1
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut [threading][logging] erreur de loggage dans un thread
    Je débute avec les Thread et j'ai un souci avec la manipulation des threads et du module logging en même temps:
    Pour mes test, j'ai défini une fonction toute simple qui affiche un nombre avec une boucle et je le logue en même temps dans un fichier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import threading as t
    import logging
     
    def a(n):
        logging.basicConfig(level=logging.DEBUG,
                        format='%(asctime)s %(levelname)s %(message)s',
                        filename='./a.log',
                        filemode='a')
        logger = logging.getLogger('alog')
        for i in range(n):
            print i
            logger.log(10,str(i))
    si je l'exécute bêtement
    pas de problème, à l'écran, j'ai bien l'impression des nombres de 1 à 100 ainsi que dans mon fichier a.log

    par contre, si je l'éxecute à partir d'un thread:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    c = t.Thread(name=None,target=a,kwargs={'n':100})
    c.start()
    A la première exécution (avec compilation), je n'ai aucune erreur mais ensuite (donc sans compilation), j'ai l'erreur suivante qui apparaît après un certains nombres d'itérations dans le for (7, pourquoi 7 ?) quand il veut logger.
    Traceback (most recent call last):
    File "C:\Python24\Lib\logging\__init__.py", line 735, in emit
    self.stream.write(fs % msg)
    ValueError: I/O operation on closed file
    Dans mon fichier a.log, j'ai simplement les nombres de 0 à 6
    2005-10-10 15:05:37,765 DEBUG 0
    2005-10-10 15:05:37,765 DEBUG 1
    2005-10-10 15:05:37,765 DEBUG 2
    2005-10-10 15:05:37,765 DEBUG 3
    2005-10-10 15:05:37,765 DEBUG 4
    2005-10-10 15:05:37,765 DEBUG 5
    2005-10-10 15:05:37,765 DEBUG 6
    Par contre, si à la fin de mon prog (juste après avoir lancé le c.start()), je rajoute:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while c.isAlive():
        continue
    je n'ai plus jamais d'erreur (mais c'était juste pour voir si ca pouvait venir que mon thread s'arrête alors qu'il n'a pas finit sa tâche)

    Avez-vous une idée de comment puis-je remédier à mon problème ?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    376
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 376
    Points : 402
    Points
    402
    Par défaut
    humpfs !

    C'est bizarre ton truc ! Surtout que la classe Logging est sensé etre Thread safe ...
    Et si tu essaye avec une classe qui extend Thread genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    class a (Thread):
       def run (self, n):
          ... le code de ta fonction ...
    et que tu lance a.start (). C'est pareil ?

  3. #3
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    Oui, j'ai le même problème (c'est vrai que çà me paraît vraiment bizarre mais comme je n'avais jamais manipulé les thread avant peut-être qu'il y a quelquechose qui m'a échappé)

    voici le test que j'ai fait:
    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
    import threading as t
    import logging
     
    class b(t.Thread):
        def __init__(self):
            t.Thread.__init__(self)
            logging.basicConfig(level=logging.DEBUG,
                            format='%(asctime)s %(levelname)s %(message)s',
                            filename='./a.log',
                            filemode='a')
            self.logger = logging.getLogger('alog')              
        def run(self):
            for i in range(100):
                print i
                self.logger.log(10,str(i))
     
    c=b()
    c.start()

  4. #4
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    en fait, si l'enlève le print i le programme fonctionne normalement et si j'enlève le logger.log(10,str(i)) aussi.

    Donc on dirait que je ne peux pas utiliser les 2 en même temps :
    (enfin je pense que c'est plus compliqué que cela car j'ai l'impression que ca bogue aussi rien qu'avec le module logging (quand ca loggue dans plusieurs endroits à la fois)).

  5. #5
    Membre expérimenté
    Avatar de nyal
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    622
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 622
    Points : 1 428
    Points
    1 428
    Par défaut
    Bonjour,

    J'ai ete voir sur le tracker. Et voici ce que j'ai trouve:
    https://sourceforge.net/tracker/?func=detail&atid=105470&aid=1277903&group_id=5470

    Il n'y a pas de resolution du bug dans la nouvelle version. (semble t il) Dommage. Il sont fermes le bug sans le resoudre... Pour ma part, je trouve que c'est un gros bug.

  6. #6
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    Bien joué !!

    C'est vrai que c'est gênant ce bug.
    Enfin, ils ont l'air de proposer une rustine (je vais voir si ça pourra marcher dans mon cas final) en ajoutant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    raw_input("Press a key:")
    ou en tout cas cela fonctionne sur mon exemple-test (en mieux que ce que j'avais rajouté pour que ça marche (avec mon isAlive))

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 08/04/2013, 23h39
  2. [Thread] Lancer la couche métier dans un thread dédié
    Par cheprod dans le forum Général Java
    Réponses: 5
    Dernier message: 07/05/2009, 00h11
  3. Erreur de segmentation dans un thread
    Par Littlepea dans le forum wxWidgets
    Réponses: 3
    Dernier message: 27/06/2008, 20h18
  4. Erreur: NullPointException dans le thread
    Par Tavarez59 dans le forum Concurrence et multi-thread
    Réponses: 10
    Dernier message: 30/03/2007, 13h27
  5. erreur d'un timer declaré dans un thread
    Par hak5 dans le forum C++Builder
    Réponses: 2
    Dernier message: 03/04/2004, 10h20

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