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 :

Des threads et un print


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2014
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Arabie Saoudite

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2014
    Messages : 51
    Points : 35
    Points
    35
    Par défaut Des threads et un print
    Bonsoir à tous,

    J'ai écrit un script qui retourne quelques informations caractérisant un répertoire (nombres de documents, images et vidéos qui existent, et la taille qu'ils occupent) dont le chemin absolue est connue. Je voudrai le paralléliser afin de gagner du temps à l'exécution.

    Voici le code séquentiel :
    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
    import tools
    import time
    import os
    import os.path
     
     
    type_=["documents","pictures","videos"]
    all_=type_+["others"]
    e={}
    e["documents"]=[".pdf",".html",".rtf",".txt"]
    e["pictures"]=[".png",".jpg",".jpeg"]
    e["videos"]=[".mpg",".avi",".mp4",".mov"]
     
     
    def statistic(directory_path):
     
        #----------------------------- Computing ---------------------------------
     
        d={t:tools.g(directory_path,e[t]) for t in type_}
        d["others"]=[os.path.join(root,f) for root, _, files_names in os.walk(directory_path) for f in files_names if os.path.splitext(f)[1].lower() not in e["documents"]+e["pictures"]+e["videos"]]
        n={t:len(d[t]) for t in type_}
        n["others"]=len(d["others"])
        s={t:tools.size1(d[t]) for t in type_}
        s["others"]=tools.size1(d["others"])
        s_dir=tools.size2(directory_path)
        p={t:s[t]*100/s_dir for t in type_}
        p["others"]=s["others"]*100/s_dir
     
        #----------------------------- Printing ---------------------------------
     
        for t in all_:
            print("{} {} use {} ({:10.2f} % of total size)".format(n[t],t,tools.compact(s[t]),p[t]))
        return s_dir
    et un exemple de ce qu'il affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    7 documents use 110.4 kb (      1.55 % of total size)
    2 pictures use 6.8 Mb (     98.07 % of total size)
    0 videos use 0.0 bytes (      0.00 % of total size)
    9 others use 26.8 kb (      0.38 % of total size)
    J'ai essayé de paralléliser le code avec des threads. Voilà ce que ça donne :
    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
    import tools
    import time
    import os
    import os.path
    import hashlib
    import threading
     
    directory_path="Users/usersos/Desktop/j"
    verrou=threading.Lock()
     
    type_=["documents","pictures","videos"]
    e={}
    e["documents"]=[".pdf",".html",".rtf",".txt"]
    e["pictures"]=[".png",".jpg",".jpeg"]
    e["videos"]=[".mpg",".avi",".mp4",".mov"]
    global n
    global s
    global p
     
    class type_thread(threading.Thread): #for documents, pictures, and videos
        def __init__(self,n,e_):
            super().__init__()
            self.extensions=e_
            self.name=n
        def __run__(self):
            files=tools.g(directory_path,self.extensions)
            cv.acquire()
            n=len(files)
            s=tools.size1(files)
            p=s*100/tools.size2(directory_path)
            print("{} {} use {} ({:10.2f} % of total size)".format(n,self.name,tools.compact(s),p))
            cv.release()
     
     
    types=[type_thread(t,e[t]) for t in type_]
     
    for t in types:
        t.start()
    for t in types:
        t.join()
    Mais lorsque j'exécute ce code, rien ne s'affiche malgré le print que j'ai mis entre mon verrou cv. En plus, lorsque je tape 't' et que je clique sur la touche 'Entrée', on me retourne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <type_thread(videos, stopped 4367323136)>
    .

    Qu'est ce qui empêche le logiciel d'écrire ce que je lui demande d'écrire ? On dirait que __run__() n'est pas lancée avec start() ….

    Bien cordialement.

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2014
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Arabie Saoudite

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2014
    Messages : 51
    Points : 35
    Points
    35
    Par défaut
    C'est bizarre, on dirait que la méthode start() ne lance pas l'exécution de __run__() : quand je la remplace par __run__() dans la boucle sur t dans types, j'ai effectivement les affichages que je demande, mais avec aussi l'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Traceback (most recent call last):
      File "/Users/usersos/Desktop/TDLOG/2014-2015/TP4/categories.py", line 55, in <module>
        t.join()
    RuntimeError: cannot join thread before it is started

  3. #3
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 298
    Points : 6 778
    Points
    6 778
    Par défaut
    Salut,

    Ce n'est pas __run__ mais run

    https://docs.python.org/3/library/th...ing.Thread.run

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2014
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Arabie Saoudite

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2014
    Messages : 51
    Points : 35
    Points
    35
    Par défaut
    Je n'ai plus l'erreur que j'ai mentionnée dans mon dernier poste quand je mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for t in types_: t.__run__()
    sans ajouter la méthode join. Ce que je comprends pas, c'est pourquoi la méthode start() ne lance pas l'exécution du thread ?

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2014
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Arabie Saoudite

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2014
    Messages : 51
    Points : 35
    Points
    35
    Par défaut
    Oui en effet, fallait définir run() et non __run__(). run() marche avec start() et join(). En revanche, __run__() marche aussi si on met qu'une seule boucle for dans laquelle on appelle __run__(), sans une autre boucle pour join().

  6. #6
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 298
    Points : 6 778
    Points
    6 778
    Par défaut
    On appelle jamais une __method__.

    S'il existe une exception, je ne la connais pas.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 11/02/2004, 13h50
  2. Une question à propos des thread
    Par tscoops dans le forum C++Builder
    Réponses: 4
    Dernier message: 07/11/2003, 15h03
  3. Variable globale / Propriété des threads
    Par rgarnier dans le forum XMLRAD
    Réponses: 4
    Dernier message: 03/10/2003, 11h49
  4. [reseaux] Gestion des threads en perl
    Par totox17 dans le forum Programmation et administration système
    Réponses: 2
    Dernier message: 28/11/2002, 10h40
  5. Programmer des threads
    Par haypo dans le forum C
    Réponses: 6
    Dernier message: 02/07/2002, 14h53

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