Потоковые HTTP-запросы (с прокси-серверами)

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

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

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

Я рассмотрел эти вопросы, в частности:

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

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

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

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

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

Ответ 1

Возможно, более простым способом было бы просто полагаться на gevent (или eventlet), чтобы вы могли открыть множество подключений к серверу. Эти libs monkeypatch urllib должны сделать async, в то же время позволяя вам писать код, который является sync-ish. Их меньшие потоки над потоками также означают, что вы можете создавать много больше (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]