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 :

Recuperation données avec multi threading


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 24
    Points : 27
    Points
    27
    Par défaut Recuperation données avec multi threading
    Bonjour,

    Je développe actuellement (pour le plaisir et pour apprendre) un programme en python qui me permet de récupérer mes mails sur mes différentes boites mails.

    J'ai créé un thread par adresse (jusque là tout va bien).
    Là où je bloque, c'est pour alimenter un tableau unique avec l'ensemble des mails récupérés dans les différents threads.

    ci dessous mon programme: la partie principale (main) est à ameliorer, je dois mettre les infos dans un tableau (pour l'instant ce n'ai pas le cas) mais le pb n'est pas là

    Merci d'avance

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
     
    import threading
    from email.header import decode_header
    from email.utils import parsedate_tz, formatdate, mktime_tz, parseaddr
    import poplib
    from email import message_from_string
     
    def get_input_connection(email, pwd, srv):
        session = poplib.POP3_SSL(srv)
        session.user(email)
        session.pass_(pwd)
     
        return session
     
    class Emails(threading.Thread):
        def __init__(self, server, user, pwd):
            threading.Thread.__init__(self)
            self.server = server
            self.user = user
            self.pwd = pwd
     
        def run(self):
            session = get_input_connection(self.user, self.pwd, self.server)
            if session <> False:
                mail_count = 0
                numMessages = session.stat()[0]
     
                for i in range(1, numMessages+1): 
                    message = '\n'.join(session.top(i, 0)[1])
                    message = message_from_string(message)
                    _from = []
                    for item in parseaddr(message['from']):
                        _from.append(self.decode_string(item))
                    sender = "%s <%s>" % (_from[0], _from[1])
     
                    timestamp = mktime_tz(parsedate_tz(message['date']))
                    date = formatdate(timestamp)
                    subject = self.decode_string(message['Subject'])
                    #uidl = session.uidl(i)
                    #id = self.user + uidl.split(' ')[2]                                      
     
                    #print sender, date, subject, timestamp
                    mail_count += 1
                print "le thread "+self.user+" s'est termine proprement "+ str(mail_count)
     
            else:
                print "Ko"
     
        def decode_string(self, string):
            value, charset = decode_header(string)[0]
            try:
                return value.decode(charset or 'utf-8')
            except:
                return value
     
    # __ Main __
    if __name__ == "__main__":
     
        a = Emails('pop.citron.fr', 'toto.titi@citron.fr','bleu')
        b = Emails('pop.citron.fr', 'tata.popo@citron.fr','rouge')
        c = Emails('pop.citron.fr', 'bob.patrick@citron.fr','vert')
        a.start()
        b.start()
        c.start()

  2. #2
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if __name__ == "__main__":
        boite = []
        block = threading.Lock()
        a = Emails('pop.citron.fr', 'toto.titi@citron.fr','bleu')
        b = Emails('pop.citron.fr', 'tata.popo@citron.fr','rouge')
        c = Emails('pop.citron.fr', 'bob.patrick@citron.fr','vert')
        a.start()
        b.start()
        c.start()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        def run(self):
            # traitement
            block.acquire()
            boite.append([self.user, sender, date, subject])
            block.release()
    Le conteneur peux être plus élaboré.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Boite(object):
        def __init__(self):
            self.pile=[]
            ...
     
        def append(self, msg):
            self.pile.append(msg)
    Et mettre en premier le dernier message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            self.pile.insert(0, msg)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if __name__ == "__main__":
        boite = Boite()
        block = threading.Lock()
    Il suffit après de temporiser les threads avec time et de pouvoir les arrêter.

    @
    Merci d'utiliser le forum pour les questions techniques.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 24
    Points : 27
    Points
    27
    Par défaut
    Bjr merci pour cette réponse aussi rapide .
    Je constaste que mon niveau est plus faible que je ne l'imaginai car je n'ai pas tout compris.
    Je m'explique, les 2 premiers bloque de code me semble clair je pense avoir compris.
    Pour le 2eme, c'est different voila comment je l'implemente dans mon programme est-ce juste?

    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
        def run(self):
            session = get_input_connection(self.user, self.pwd, self.server)
            if session <> False:
                mail_count = 0
                numMessages = session.stat()[0]
     
                for i in range(1, numMessages+1): 
                    message = '\n'.join(session.top(i, 0)[1])
                    message = message_from_string(message)
                    _from = []
                    for item in parseaddr(message['from']):
                        _from.append(self.decode_string(item))
                    sender = "%s <%s>" % (_from[0], _from[1])
     
                    timestamp = mktime_tz(parsedate_tz(message['date']))
                    date = formatdate(timestamp)
                    subject = self.decode_string(message['Subject'])
                    #uidl = session.uidl(i)
                    #id = self.user + uidl.split(' ')[2]                                      
     
                    #print sender, date, subject, timestamp
                    mail_count += 1
     
                    # traitement
                    block.acquire()
                    boite.append([self.user, sender, date, subject])
                    block.release()
                print "le thread "+self.user+" s'est termine proprement "+ str(mail_count)
    Mais là où je suis dans le flou total, c'est pour les 3 derniers block de code!!
    Je ne sais pas quoi en faire?

    Merci d'avance

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

Discussions similaires

  1. EventListener avec multi-thread
    Par zenico64 dans le forum Android
    Réponses: 1
    Dernier message: 13/02/2013, 09h32
  2. Réponses: 7
    Dernier message: 17/09/2012, 06h13
  3. [PHP 5.0] probleme recuperation données avec apostrophes
    Par livinho38 dans le forum Langage
    Réponses: 3
    Dernier message: 10/07/2009, 12h06
  4. base données avec java mono et multi utilisateurs
    Par Garion dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 03/12/2004, 09h20
  5. [VB6][active x] faire du multi-thread avec vb
    Par pecheur dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 20/05/2003, 12h01

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