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

Réseau/Web Python Discussion :

téléchargement multi thread


Sujet :

Réseau/Web Python

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 94
    Points : 116
    Points
    116
    Billets dans le blog
    1
    Par défaut téléchargement multi thread
    Bonjour

    On voit parfois dans certains softs de téléchargement que plusieurs threads sont utilisés pour effectuer le téléchargement d'un seul et même fichier. Les threads se partagent alors le travail en troncons (apparemment lorsqu'on regarde certaines interfaces graphiques, cela ressemble à ce que j'explique)

    J'aimerais reproduire ce comportement, à savoir effectuer le téléchargement de mon fichier avec plusieurs threads. (par exemple 4 threads, le premier charge le premier quart du fichier, pendant que le second télécharge le second quart de mon fichier, le 3ieme thread télécharge le 3ieme quart ...)

    Pensez vous que cela soit possible ?
    Actuellement je télécharge avec urllib et urllib2, j'ai mis en place un équivalent du hook de urlretrieve pour suivre le téléchargement.

    Merci d'avance pour votre aide

  2. #2
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Salut

    Il ne s'agit pas là de threads comme on pourrait le croire. En réalité, il s'agit d'un ensemble de connexion qu'une et une seule thread surveille pour savoir s'il y a ou non des données à recevoir.

    Je ne pense pas que tu puisses faire celà à l'aide de l'urllib. Il te faudra mettre les mains un peu plus dans le cambouis pour toucher aux sockets et aux différents protocoles (http, ftp etc)

    Note: les téléchargements par http ne permettent pas ce genre de fragmentation des téléchargements. Il s'agit en général de liens ftp.

    La manière de procéder est (à peu près) la suivante:
    - Tu ouvres autant de sockets que voulu pour telecharger un même fichier.
    - Tu monitor ensuite à interval régulier tout ces sockets, à l'aide de poll ou select, ce dernier étant plus facile à l'usage.

    Exemple de code (non testé):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    from select import select
     
    socks = [] # Soit une liste / tuple / set dans lequel tu mettras tous les sockets
     
    # Select prend quatre arguments:
    # 1: groupe des sockets que l'on veut lire
    # 2: groupe des sockets que l'on veut écrire
    # 3: groupe dont on attend un truc exceptionnel (je ne sais pas ce que c'est, honnêtement)
    # 4: le timeout (paramètre facultatif)
    read, write, e = select(socks, [], [], 30)
     
    for readable in read:
        # lire des données depuis le socket "readable"
    Petite note intéressante: Le contenu des listes que tu passes à select ne doivent pas forcément être des sockets. En réalité, ça peut aussi être des file descriptors, petits entiers positifs, ou encore être un objet possédant la fonction fileno().

    De cette manière, tu peux créer des classes qui vont gérer le telechargement proprement (code tjs non testé):
    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
    class Downloader:
        def __init__(self, sock):
            # Par simplicité, on prend un socket établi en paramètre
            self.__sock = sock
     
        def fileno(self):
            return self.__sock.fileno()
     
        def downloadSome(self):
            # Effectuer la routine de lecture et de stockage des infos
            data = self.__sock.read()
            # etc...
     
    socks = []
    # créer des sockets de téléchargement, disons sock1, sock2
    socks.append(Downloader(sock1))
    socks.append(Downloader(sock2))
     
    read, write, e = select(socks, [], [])
     
    for readable in read:
        readable.downloadSome()

  3. #3
    Membre régulier

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 94
    Points : 116
    Points
    116
    Billets dans le blog
    1
    Par défaut
    Ok super je te remerci.

    Ton exemple est super instructif (pour moi en tous cas vu que je me débrouille tout seul pour apprendre à coder)

    J'ai fait fonctionner un truc qui utilise le header http 'range' pour demander la récupération en plusieurs fragments du fichier.

    J'ai tester aussi le téléchargement tout basique urllib et le temps était le même. J'en viens donc à me demander si c'est vraiment utile, ou alors ma technique n'apporte t'elle pas de meilleur performance. (je rappelle ou pas, que mon but était d'accélérer le téléchargement dans certaines circonstances, c'est à dire lorsque la bande passante fournie par le serveur est en deça de la bande passante de l'utilisateur.)

    Ma solution utilise le header http range pour choisir les morceaux à récupérer, et les sockets pour récupérer directement les données, chaque socket se voyant attribuer un fragment de téléchargement.

    Si quelqu'un à autre chose à ajouter, sur les performances, l'utilité du truc, ou sur une autre solution, merci de me le faire savoir car je ne considère pas le sujet terminé

    Merci

Discussions similaires

  1. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  2. Réponses: 2
    Dernier message: 15/05/2004, 18h33
  3. Réponses: 16
    Dernier message: 30/01/2004, 11h05
  4. [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
  5. [Kylix] exception qtinft.dll et multi-threading
    Par leclaudio25 dans le forum EDI
    Réponses: 3
    Dernier message: 27/03/2003, 18h09

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