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 :

Téléchargement de fichier et Multithreading [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 3
    Par défaut Téléchargement de fichier et Multithreading
    Bonjour à tous,

    J'essaye de developper un script qui télécharge un fichier mp3 à partir d'un Raspberry Pi.
    J'arrive à télécharger mon fichier et à afficher une barre de progression pendant le téléchargement.
    Maintenant, je voudrais utiliser les PIN GPIO du Raspberry pour faire clignoter une LED pendant le téléchargement. Le problème est que pour faire clignoter une LED, il faut utiliser la fonction "sleep" qui du coup met en pause aussi le téléchargement. En cherchant un peu, j'ai vu qu'on pouvait faire du Multithreading, j'ai récupérer des bouts de code sur le net mais ça ne fonctionne pas. Voici l'intégralité du script :
    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    import requests
    import sys
    import glob
    import os
    from os.path import basename, splitext
    import RPi.GPIO as GPIO
    from time import sleep
    import threading
     
    ##############################################################
    class StopThread(StopIteration): pass
     
    threading.SystemExit = SystemExit, StopThread
     
    class Thread2(threading.Thread):
     
        def stop(self):
            self.__stop = True
     
        def _bootstrap(self):
            if threading._trace_hook is not None:
                raise ValueError('Cannot run thread with tracing!')
            self.__stop = False
            sys.settrace(self.__trace)
            super()._bootstrap()
     
        def __trace(self, frame, event, arg):
            if self.__stop:
                raise StopThread()
            return self.__trace
    #############################################################
     
    filepath = glob.glob('Music/*.mp3')[0]
    filename = splitext(basename(filepath))[0]
    print (filename)
     
    LED = 24
     
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(LED, GPIO.OUT)
    GPIO.setwarnings(False)
     
    def download_led():
        while True:
            GPIO.output(LED, GPIO.HIGH)
            sleep(1)
            GPIO.output(LED, GPIO.LOW)
            sleep(1)
     
    def flashLED(speed, time):
        for x in range(0, time):
            GPIO.output(LED, GPIO.LOW)
            sleep(speed)
            GPIO.output(LED, GPIO.HIGH)
            sleep(speed)
     
    def downloadMusic(lien) :
    	link = lien
    	file_name = "Music/"+lien[54:]
    	with open(file_name, "wb") as f:
            	print ("Downloading %s" % file_name)
            	response = requests.get(link, stream=True)
            	total_length = response.headers.get('content-length')
            	#GPIO.output(LED, GPIO.HIGH)
     
            	if total_length is None: # no content length header
                		f.write(response.content)
            	else:
                		dl = 0
                		total_length = int(total_length)
                		for data in response.iter_content(chunk_size=4096):
                			flashing_thread = Thread2(target=download_led())
                			flashing_thread.start()
                			dl += len(data)
                			f.write(data)
                			done = int(50 * dl / total_length)
                			sys.stdout.write("\r[%s%s]" % ('=' * done, ' ' * (50-done)))
                			sys.stdout.flush()
                		if flashing_thread and flashing_thread.isAlive():
                			flashing_thread.stop()
     
    liendl = "https://archive.org/download/auboutdufil-archives/481/BranchImmersion-Movement-02Correlation.mp3"
    fileliendl = liendl[54:]
    liendlsansex = fileliendl[:-4]
    if filename != liendlsansex:
    	#flashLED(0.1, 10)
    	downloadMusic(liendl)
    	os.system("rm Music/"+filename+".mp3")
    	#flashLED(0.1, 10)
     
    GPIO.cleanup()
    Donc soit le threading ne fonctionne pas, soit je n'appelle pas les fonctions là où il faut.
    En tout cas je n'ai pas de message d'erreur et le téléchargement se fait mais très très lentement.

    Je pense que, par ailleurs, beaucoup de choses pourraient être optimisées mais ce n'est pas l'objet ici.
    Pour info, le but de final est de faire, avec un raspberry, un lecteur de livre audio avec un seul bouton. Ce bout de code servira à télécharger un nouveau livre lorsque le premier sera terminé.

    Merci d'avance pour votre aide.

  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,

    Relisez votre code! A chaque itération de la boucle de téléchargement vous créez un nouveau thread...

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

  3. #3
    Candidat au Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 3
    Par défaut
    Salut,

    J'ai aussi essayé juste en dessous du with mais ça faisait pareil. Je vais faire quelques tests en mettant l'appel du thread ailleurs.
    Je vais tester ça ce soir.

    Merci

  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
    Citation Envoyé par casgiu Voir le message
    J'ai aussi essayé juste en dessous du with mais ça faisait pareil. Je vais faire quelques tests en mettant l'appel du thread ailleurs.
    Bouger les lignes, certes çà serait mieux mais le problème étant dans la ligne, vous ne ferez que bouger le problème.
    Encore une fois, relisez votre code en particulier la ligne 72...
    Ajoutez des "print" pour comprendre ce qu'il se passe.

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

  5. #5
    Candidat au Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 3
    Par défaut
    J'ai trouvé. L'appel de la fonction était effectivement mal placé, mais en plus la classe était mal construite. Il me manquait un gros bout de code. Voici le code final si ça intéresse quelqu'un. Surtout que j'ai eu beaucoup de mal à trouver une méthode qui marche pour arrêter un thread correctement.
    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    import requests
    import sys
    import glob
    import os
    from os.path import basename, splitext
    import RPi.GPIO as GPIO
    from time import sleep
    import threading
    ##############################################################
     
    class Thread2(threading.Thread):
     
    	def __init__(self):
    		super(Thread2, self).__init__()
    		self._stopper = threading.Event()
     
    	def run(self):
    		while not self.stopped:
    			GPIO.output(LED, GPIO.HIGH)
    			sleep(1)
    			GPIO.output(LED, GPIO.LOW)
    			sleep(1)
     
    	def stopit(self):
    		self._stopper.set()
     
    	def stopped(self):
    		return self._stopper.is_set()
     
    #############################################################
     
    filepath = glob.glob('Music/*.mp3')[0]
    filename = splitext(basename(filepath))[0]
    print (filename)
     
    LED = 24
     
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(LED, GPIO.OUT)
    GPIO.setwarnings(False)
     
    def download_led():
        while True:
            GPIO.output(LED, GPIO.HIGH)
            sleep(1)
            GPIO.output(LED, GPIO.LOW)
            sleep(1)
     
    def flashLED(speed, time):
        for x in range(0, time):
            GPIO.output(LED, GPIO.LOW)
            sleep(speed)
            GPIO.output(LED, GPIO.HIGH)
            sleep(speed)
     
    def downloadMusic(lien) :
    	link = lien
    	file_name = "Music/"+lien[54:]
     
    	with open(file_name, "wb") as f:
            	print ("Downloading %s" % file_name)
            	response = requests.get(link, stream=True)
            	total_length = response.headers.get('content-length')
     
            	if total_length is None: # no content length header
                		f.write(response.content)
            	else:
                		dl = 0
                		total_length = int(total_length)
                		for data in response.iter_content(chunk_size=4096):
                			dl += len(data)
                			f.write(data)
                			done = int(50 * dl / total_length)
                			sys.stdout.write("\r[%s%s]" % ('=' * done, ' ' * (50-done)))
                			sys.stdout.flush()
    	sleep(0.5)
     
     
    liendl = "https://archive.org/download/auboutdufil-archives/481/BranchImmersion-Movement-02Correlation.mp3"
    fileliendl = liendl[54:]
    liendlsansex = fileliendl[:-4]
    if filename != liendlsansex:
     
    	flashing_thread = Thread2()
    	flashing_thread.start()
     
    	downloadMusic(liendl)
     
    	flashing_thread.stopit()
     
    	os.system("rm Music/"+filename+".mp3")
     
     
    GPIO.cleanup()
    Merci en tout cas.

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

Discussions similaires

  1. Téléchargement de fichier
    Par casafa dans le forum Web & réseau
    Réponses: 21
    Dernier message: 18/06/2009, 23h34
  2. Réponses: 5
    Dernier message: 08/12/2005, 20h13
  3. Téléchargement de fichiers par HTTP / FTP
    Par Gladiator dans le forum Serveurs (Apache, IIS,...)
    Réponses: 2
    Dernier message: 07/12/2005, 11h28
  4. Réponses: 5
    Dernier message: 05/11/2005, 17h53
  5. [SOAP][XML][C#.NET] Téléchargement de fichiers XML
    Par juniorAl dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 27/06/2005, 09h35

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