Le Multithreading pour un téléchargement plus rapide
Comment puis-je télécharger plusieurs liens en même temps? Mon script ci-dessous fonctionne, mais seulement les téléchargements un par un et il est extrêmement lent. Je ne peux pas comprendre comment intégrer le multithreading dans mon script.
Le script Python:
from BeautifulSoup import BeautifulSoup
import lxml.html as html
import urlparse
import os, sys
import urllib2
import re
print ("downloading and parsing Bibles...")
root = html.parse(open('links.html'))
for link in root.findall('//a'):
url = link.get('href')
name = urlparse.urlparse(url).path.split('/')[-1]
dirname = urlparse.urlparse(url).path.split('.')[-1]
f = urllib2.urlopen(url)
s = f.read()
if (os.path.isdir(dirname) == 0):
os.mkdir(dirname)
soup = BeautifulSoup(s)
articleTag = soup.html.body.article
converted = str(articleTag)
full_path = os.path.join(dirname, name)
open(full_path, 'w').write(converted)
print(name)
Le fichier HTML appelé links.html
:
<a href="http://www.youversion.com/bible/gen.1.nmv-fas">http://www.youversion.com/bible/gen.1.nmv-fas</a>
<a href="http://www.youversion.com/bible/gen.2.nmv-fas">http://www.youversion.com/bible/gen.2.nmv-fas</a>
<a href="http://www.youversion.com/bible/gen.3.nmv-fas">http://www.youversion.com/bible/gen.3.nmv-fas</a>
<a href="http://www.youversion.com/bible/gen.4.nmv-fas">http://www.youversion.com/bible/gen.4.nmv-fas</a>
- Vous n'avez même pas essayé encore rien, de sorte que vous n'avez pas réellement un problème, nous pouvons vous aider avec.
- ouvert(full_path, 'wb').écrire(convertis) !!! vous souhaitez télécharger des fichiers binaires
Vous devez vous connecter pour publier un commentaire.
Il me semble que le consommateur - producteur problème - voir wikipedia
Vous pouvez utiliser
NameError: name 'queue' is not defined
et si je capitaliser "File d'attente", j'obtiens cette erreurAttributeError: 'module' object has no attribute 'put'
thread
lorsque vous avez importé un module du même nom?from Queue import Queue
(pour python 2.X) etfrom threading import Thread
, puis la dernière ligne devrait êtreThread.start_new(thread,())
... je pense. (Je n'utilise pas vraimentthreading
donc je ne sais pas pour sûr.)TypeError: unbound method put() must be called with Queue instance as first argument (got str instance instead)
- Je utiliser
multiprocessing
pour la parallélisation de choses, pour une raison que je l'aime mieux quethreading
AssertionError: invalid Element proxy at 163319020
multiprocessing
. Si le lien.obtenir retourne une chaîne de caractères, qui devraient jouer un peu plus gentiment...En 2017 il y a quelques autres options maintenant, comme asyncio et ThreadPoolExecutor.
Voici un exemple de ThreadPoolExecutor (inclus dans Python à terme)
submit() en fonction de présenter la tâche à une file d'attente. (gestion de file d'attente est fait pour vous)
Vous pouvez définir max_workers, un peu de temps, le nombre de cœurs du PROCESSEUR, dans la pratique, de faire quelques essais pour voir comment faw, vous pouvez aller jusqu', en fonction de commutation de contexte généraux.
Pour plus d'info:
https://docs.python.org/3/library/concurrent.futures.html