Потоковые HTTP-запросы (с прокси) - PullRequest
1 голос
/ 01 июля 2011

Я смотрел на похожие вопросы, но, похоже, всегда было много разногласий по поводу лучшего способа обработки потоков с помощью HTTP.

Что я конкретно хочу сделать: я использую Python 2.7, и я хочу попробовать потоковые HTTP-запросы (в частности, POSTing что-то) с прокси SOCKS5 для каждого. У меня уже работает код, но он довольно медленный, поскольку он ожидает завершения каждого запроса (к прокси-серверу, а затем к веб-серверу), прежде чем запускать другой. Скорее всего, каждый поток будет делать разные запросы с разными прокси-серверами SOCKS.

Пока я просто использовал urllib2. Я посмотрел на такие модули, как PycURL, но крайне трудно правильно установить Python 2.7 на Windows, который я хочу поддерживать и на котором я пишу код. Я бы хотел использовать любой другой модуль.

В частности, я рассмотрел следующие вопросы:

Python urllib2.urlopen () работает медленно, требуется лучший способ чтения нескольких URL

Python - Пример асинхронного / потокового запроса urllib2 с использованием HTTPS

Многие из примеров получили отрицательные отзывы и аргументы. Предполагая, что комментаторы верны, создание клиента с асинхронной структурой, такой как Twisted, кажется, что это будет самая быстрая вещь для использования. Тем не менее, я свирепо погуглил, и он не предоставляет никакой поддержки для прокси SOCKS5. В настоящее время я использую модуль Socksipy, и я могу попробовать что-то вроде:

socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, IP, port)
socks.wrapmodule(twisted.web.client)

Я понятия не имею, сработает ли это, хотя и я даже не знаю, действительно ли Twisted - это то, что я действительно хочу использовать. Я также мог бы просто пойти с модулем потоков и добавить его в мой текущий код urllib2, но если это будет намного медленнее, чем в Twisted, я не хочу беспокоиться. У кого-нибудь есть понимание?

1 Ответ

3 голосов
/ 03 июля 2011

Возможно, более простым способом было бы просто положиться на gevent (или eventlet), чтобы позволить вам открывать множество соединений с сервером. Эти библиотеки делают monkeypatch urllib, чтобы затем выполнять асинхронность, в то же время позволяя вам писать код для синхронизации. Их меньшие накладные расходы по сравнению с потоками также означают, что вы можете порождать намного больше (1000 не будут необычными).

Я использовал что-то вроде этого (плагиат из здесь ):

urls = ['http://www.google.com', 'http://www.yandex.ru', 'http://www.python.org']

import gevent
from gevent import monkey

# patches stdlib (including socket and ssl modules) to cooperate with other greenlets
monkey.patch_all()

import urllib2


def print_head(url):
    print ('Starting %s' % url)
    data = urllib2.urlopen(url).read()
    print ('%s: %s bytes: %r' % (url, len(data), data[:50]))

jobs = [gevent.spawn(print_head, url) for url in urls]
...