Многопоточность для более быстрой загрузки

Как загрузить несколько ссылок одновременно? Мой скрипт ниже работает, но загружает только по одному, и он очень медленный. Я не могу понять, как включить многопоточность в мой скрипт.

Сценарий 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) 

HTML-файл с именем 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> 

2 Solutions collect form web for “Многопоточность для более быстрой загрузки”

Мне кажется, что проблема потребителя – производителя – см. Wikipedia

Вы можете использовать

 import Queue, thread # create a Queue.Queue here queue = Queue.Queue() print ("downloading and parsing Bibles...") root = html.parse(open('links.html')) for link in root.findall('//a'): url = link.get('href') queue.put(url) # produce def thrad(): url = queue.get() # consume 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, 'wb').write(converted) print(name) thread.start_new(thrad, ()) # start 1 threads 

Я использую multiprocessing для распараллеливания вещей – по какой-то причине мне это нравится лучше, чем threading

 from BeautifulSoup import BeautifulSoup import lxml.html as html import urlparse import os, sys import urllib2 import re import multiprocessing print ("downloading and parsing Bibles...") def download_stuff(link): 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) root = html.parse(open('links.html')) links = root.findall('//a') pool = multiprocessing.Pool(processes=5) #use 5 processes to download the data output = pool.map(download_stuff,links) #output is a list of [None,None,...] since download_stuff doesn't return anything 
Interesting Posts

Как написать регулярное выражение для замены слова, но сохранить его в Python?

Получить зарегистрированного пользователя Django в файле models.py?

@csrf_exempt перестала работать в Django 1.4

uWSGI Server log … разрешено ли читать файл … какой файл?

Matplotlib не работает после успешной установки на Mountain Lion

доверительный интервал с наименьшим значением, подходящим для scipy python

Как я могу сделать массив B из массива A без бесконечностей, включенных в Python 2.7?

Как определить, подключен ли sys.stdout к терминалу или нет?

Как изменить стандартную среду python Anaconda

Не удается импортировать comtypes.gen

Linux блокирует сигналы для Python init

Как изменить ответ в фляге в функции after_request?

Python. Argparser. Удаление ненужных аргументов

Солить все атрибуты, кроме одного

Есть ли выигрыш в производительности от определения маршрутов в app.yaml по сравнению с одним большим отображением в WSGIApplication в AppEngine?

Python - лучший язык программирования в мире.