Вопрос по python, http, concurrency, httprequest – Идеальный метод для отправки нескольких HTTP-запросов через Python? [Дубликат]

7

Возможное дублирование:
Несколько (асинхронных) соединений с urllib2 или другой библиотекой http?

Я работаю на веб-сервере Linux, который запускает код Python для получения данных в реальном времени по HTTP из стороннего API. Данные помещаются в базу данных MySQL. Мне нужно сделать много запросов ко многим URL-адресам, и мне нужно сделать это быстро (быстрее = лучше). В настоящее время я использую urllib3 в качестве библиотеки HTTP. Каков наилучший способ сделать это? Должен ли я создавать несколько потоков (если так, сколько?) И каждый запрос для другого URL? Я хотел бы услышать ваши мысли об этом - спасибо!

Есть новый ответ, который я не могу добавить, потому что этот вопрос был закрыт. Лучший способ сделать это сегодня - это использовать запросы-фьючерсы Github.com / ROSS / запросы-фьючерсы Chris Broski

Ваш Ответ

3   ответа
26

мног действительномног чем вы, вероятно, хотите использовать асинхронный, а не потоки.

Запрос + GEvent = Grequests

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)
Я хочу использовать этот метод для отправки запросов на 50000 URL. Это хорошая стратегия? А как насчет исключений, таких как тайм-аут и т. Д John
@ Джон Да, это так. Что касается исключений, см.safe_mode параметр и проблема 953 Piotr Dobrogost
Я не могу отправить более 30 запросов, используя grequest. Когда я это делаю, я получаю «Максимальное количество попыток превышено с помощью url: ..., Слишком много открытых файлов». Есть ли способ решить эту проблему? AliBZ
@ droope это не похоже на то, что грекисты заброшены, и кажется, что на них легче бегатьpython_ver < 3.4. У вас есть ссылка на пакет backports, о котором вы говорите? Это самый популярный пакет, который я вижу: Pypi.python.org / PyPI / backports.ssl_match_hostname Ehtesh Choudhury
Слово предупреждения: «Греквесты», по-видимому, заброшены и не имеют обработки ошибок. Моя личная рекомендация - Github.com / ROSS / запросы-фьючерсы, который одинаково быстр и с backports также работает на 2.7. droope
1

в. Например поиск-> подробности-> сохранить

Количество нитей, которые вы можете использовать, зависит не только от вашего оборудования. Сколько запросов может обслуживать сервис? Сколько одновременных запросов это позволяет выполнить? Даже ваша пропускная способность может стать узким местом.

Если вы говорите о некоторой проверке - служба может заблокировать вас после определенного количества запросов, поэтому вам нужно использовать прокси или несколько IP-привязок.

Что касается меня, то в большинстве случаев я могу выполнить на своем ноутбуке 50-300 одновременных запросов из сценариев Python.

Согласен с Polscha, здесь. Большую часть времени, когда вы делаете HTTP-запросы к произвольной службе, большая часть времени (часов) тратится на ожидание ответа от сети и удаленной службы. Таким образом, в разумных пределах, чем больше потоков, тем лучше, как и в любой конкретный момент, большинство этих потоков будет просто в очередях ожидания. Обязательно прислушайтесь к примечаниям Polscha о регулировании обслуживания. parselmouth
@ user1094786 В этом случае просто попробуйте построить конвейер запросов и поэкспериментируйте с количеством потоков на каждом этапе. Просто попробуйте, рано или поздно вы найдете верхний предел: -) Maksym Polshcha
спасибо ребята - сервис коммерческий и мы за это платим. это очень быстро и не будет узким местом. в этом случае, что будет лучшим вариантом? user1094786
0

Twisted. Вот некоторые веб-примеры, в том числе как скачать веб-страницу. Вот связанный вопрос на соединения с базой данных Twisted.

Обратите внимание, что Twisted делаетн полагаться на темы для выполнения нескольких вещей одновременно. Скорее, требуется кооперативная многозадачность подхода --- ваш главный скрипт запускает реактор, а реактор вызывает функции, которые вы настроили. Ваши функции должны вернуть управление реактору, прежде чем реактор сможет продолжить работу.

Похожие вопросы