2010-11-10 4 views
2

Je souhaite télécharger plusieurs images en même temps. Pour cela, j'utilise des threads, chacun téléchargeant une image, en utilisant le module urllib2. Mon problème est que même si les threads démarrent (presque) simultanément, les images sont téléchargées une par une, comme dans un environnement monothread.Plusieurs connexions urllib2

est ici la fonction filetée:

def updateIcon(self, iter, imageurl): 
    req = urllib2.Request('http://site.com/' + imageurl) 
    response = urllib2.urlopen(req) 
    imgdata = response.read() 
    gobject.idle_add(self.setIcon, iter, imgdata) 

Débogage mon code, j'ai trouvé que les téléchargements semble rester coincé à la ligne "réponse = urllib2.urlopen (REQ)". Quel est le problème? C'est parce que le module de threading ou urllib2? Comment je peux réparer ça?

Nous vous remercions à l'avance

+1

Pouvez-vous inclure un peu plus d'informations? Plus précisément, le bloc de code qui lance les threads, ainsi que les outils et les données résultantes utilisés pour déterminer qu'il est bloqué sur la ligne 'response ='? – jonesy

Répondre

3

Envisagez d'utiliser urllib3. Il prend en charge le regroupement de connexions et plusieurs demandes simultanées via des processus (pas de threads). Cela devrait résoudre ce problème. Faites attention à ramasser les pools de connexion si vous contactez beaucoup de sites différents, car chaque site dispose de son propre pool.

0

Dans mon expérience, multithreads de CPython semble faire de meilleures performances que celles du fil Sigle. Parce que CPython a une implémentation de thread basée sur le thread du noyau. Mais la différence est faible, à cause de GIL (Global Interpreter Lock). Remplacer le multitraitement par le multithreading. C'est facile. Les deux ont une interface similaire.