Как ускорить большое количество get запросов?

Таблица из двух стобцов id и url, 5 миллионов записей
Требуется дернуть все урлы get запросом и получить айдишники урлов у которых статус не 200.
Если делать это последовательно, то уходит очень много времени.(особенно если учесть то что некоторые отдают 504)

Как ускорить поиск?
  • Вопрос задан
  • 501 просмотр
Решения вопроса 1
@asd111
Основное происходит в строке с pool.map

import urllib2 
from multiprocessing.dummy import Pool as ThreadPool 

urls = [
  'http://www.python.org', 
  'http://www.python.org/about/',
  'http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html',
  'http://www.python.org/doc/',
  'http://www.python.org/download/',
  'http://www.python.org/getit/',
  'http://www.python.org/community/',
  'https://wiki.python.org/moin/',
  'http://planet.python.org/',
  'https://wiki.python.org/moin/LocalUserGroups',
  'http://www.python.org/psf/',
  'http://docs.python.org/devguide/',
  'http://www.python.org/community/awards/'
  # etc.. 
  ]

# Make the Pool of workers
pool = ThreadPool(4) 
# Open the urls in their own threads
# and return the results
results = pool.map(urllib2.urlopen, urls)
#close the pool and wait for the work to finish 
pool.close() 
pool.join()
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 5
netpastor
@netpastor
Python developer
Если идут несколько запросов к одному серверу, то стоит использовать сессию что не открывать каждый раз новый коннекшен. У requests к примеру есть requests.session.
Ответ написан
Комментировать
@OlegPyatakov
pyatakov.com
Основная потеря времени - ожидание ответов от удаленных серверов.

Варианты, что делать для ускорения:
  1. Работать в несколько потоков
  2. Работать в несколько процессов
  3. Работать через асинхронные запросы
Ответ написан
Комментировать
sim3x
@sim3x
Быстрее чем может отдать сервер - никак
Используйте scrapy - там есть весь требуемый функционал

Если сайт донор на шареде, то его еще может прибанить хостер
Потому не делайте на него 100RPS
Ответ написан
inoise
@inoise
Solution Architect, AWS Certified, Serverless
Как на счёт распараллелить задачи с помощью воркеров ? У меня всегда на этот случай есть message broker. Я просто накидывают туда задачи и в зависимости от числа задач ставлю больше или меньше воркеров. Только есть проблема что если ресурс один или не большое колличество то вас могут забанить
Ответ написан
dimonchik2013
@dimonchik2013
non progredi est regredi
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы