Идеальный метод для отправки нескольких HTTP-запросов через Python?
Возможный дубликат:
Несколько (асинхронных) соединений с urllib2 или другой библиотекой http?
Я работаю на веб-сервере Linux, на котором выполняется код Python для сбора данных в реальном времени по HTTP из стороннего API. Данные помещаются в базу данных MySQL. Мне нужно сделать много запросов ко многим URL-адресам, и мне нужно сделать это быстро (быстрее = лучше). В настоящее время я использую urllib3 в качестве библиотеки HTTP. Каков наилучший способ сделать это? Должен ли я создавать несколько потоков (если так, сколько?) И каждый запрос для другого URL? Я хотел бы услышать ваши мысли об этом - спасибо!
3 ответа
Если много действительно много, вы, вероятно, хотите использовать асинхронный ввод, а не потоки.
GRequests позволяет вам использовать запросы с Gevent, чтобы легко выполнять асинхронные HTTP-запросы.
import grequests
urls = [
'http://www.heroku.com',
'http://tablib.org',
'http://httpbin.org',
'http://python-requests.org',
'http://kennethreitz.com'
]
rs = (grequests.get(u) for u in urls)
grequests.map(rs)
Вы должны использовать многопоточность, а также конвейерную обработку запросов. Например поиск-> подробности-> сохранить
Количество потоков, которые вы можете использовать, зависит не только от вашего оборудования. Сколько запросов может обслуживать сервис? Сколько одновременных запросов это позволяет выполнить? Даже ваша пропускная способность может быть узким местом.
Если вы говорите о некоторой проверке - служба может заблокировать вас после определенного количества запросов, поэтому вам нужно использовать прокси или несколько IP-привязок.
Что касается меня, в большинстве случаев я могу выполнить 50-300 одновременных запросов на моем ноутбуке из сценариев Python.
Звучит как отличное приложение для Twisted. Вот несколько примеров, связанных с Интернетом, включая загрузку веб-страницы. Вот связанный вопрос о соединениях с базой данных с Twisted.
Обратите внимание, что Twisted не использует потоки для одновременного выполнения нескольких задач. Скорее, он требует совместного многозадачного подхода - ваш основной скрипт запускает реактор, а реактор вызывает функции, которые вы настроили. Ваши функции должны вернуть управление реактору, прежде чем реактор сможет продолжить работу.