Моя задача - загрузить более 1 млн изображений из заданного списка URL-адресов. Каков рекомендуемый способ сделать это?
Прочитав Greenlet Vs. Потоки Я просмотрел gevent
, но мне не удалось его надежно запустить. Я поиграл с тестовым набором из 100 URL-адресов, и иногда он завершается за 1,5 с, но иногда требуется более 30 с, что странно, поскольку время ожидания * на запрос составляет 0,1, поэтому оно никогда не должно занимать более 10 с.
* см. ниже в коде
Я также изучил grequests
, но у них, похоже, есть проблемы с обработкой исключений.
Мои «требования» заключаются в том, что я могу
- проверить ошибки, возникающие при загрузке (тайм-ауты, поврежденные изображения...),
- следить за ходом обработки количества обработанных изображений и
- быть как можно быстрее.
from gevent import monkey; monkey.patch_all()
from time import time
import requests
from PIL import Image
import cStringIO
import gevent.hub
POOL_SIZE = 300
def download_image_wrapper(task):
return download_image(task[0], task[1])
def download_image(image_url, download_path):
raw_binary_request = requests.get(image_url, timeout=0.1).content
image = Image.open(cStringIO.StringIO(raw_binary_request))
image.save(download_path)
def download_images_gevent_spawn(list_of_image_urls, base_folder):
download_paths = ['/'.join([base_folder, url.split('/')[-1]])
for url in list_of_image_urls]
parameters = [[image_url, download_path] for image_url, download_path in
zip(list_of_image_urls, download_paths)]
tasks = [gevent.spawn(download_image_wrapper, parameter_tuple) for parameter_tuple in parameters]
for task in tasks:
try:
task.get()
except Exception:
print 'x',
continue
print '.',
test_urls = # list of 100 urls
t1 = time()
download_images_gevent_spawn(test_urls, 'download_temp')
print time() - t1
multiprocessing.Pool
, и вы также можете найти это проще. Я используюpool.map(download_image, url_list)
иpool.join()
, чтобы сделать что-то подобное. - person foz   schedule 09.11.2015multiprocessing.Pool
с похожими проблемами. Также мне сказали, чтоmultiprocessing
не подходит для таких задач: stackoverflow.com/a/27016937/380038 - person Framester   schedule 09.11.2015