Requests: gevent + fordert Blöcke an, wenn Socken verwendet werden

Erstellt am 10. Feb. 2017  ·  3Kommentare  ·  Quelle: psf/requests

Ich verwende Python(2.7.6),gevnet(1.1.2),requests(2.11.1), um http-Anfragen gleichzeitig zu machen, und es funktioniert gut. Aber wenn ich den Anfragen einen Socken-Proxy hinzufüge, wird er blockiert.

Das ist mein Code:

import time
import requests
import logging
import click

import gevent
from gevent import monkey
monkey.patch_all()

FORMAT = '%(asctime)-15s %(message)s'
logging.basicConfig(format=FORMAT)
logger = logging.getLogger('test')

#socks proxy
user = MY_SOCKS_PROXY_USERNAME
password = MY_SOCKS_PROXY_PASSWORD
host = MY_SOCKS_PROXY_HOST
port = MY_SOCKS_PROXY_PORT
proxies = {
        'http': 'socks5://{0}:{1}@{2}:{3}'.format(user, password, host, port),
        'https': 'socks5://{0}:{1}@{2}:{3}'.format(user, password, host, port),
}
url = 'https://www.youtube.com/user/NBA'


def fetch_url(i,with_proxy):
    while True:
        logger.warning('thread %s fetch url'%i)
        try:
            if with_proxy:
                res = requests.get(url,proxies=proxies, timeout=5)
            else:
                res = requests.get(url, timeout=5)
        except Exception as e:
            logger.error(str(e))
            continue

        logger.warning(res.status_code)

def do_other_thing():
    while True:
        logger.warning('do other thing...')
        time.sleep(1)

@click.command()
@click.option('--with_proxy/--without_proxy',help='if use proxy', default=True)
def run(with_proxy):
    if with_proxy:
        logger.warning('with proxy......')
    else:
        logger.warning('without proxy......')
    ts = []
    ts.append(gevent.spawn(do_other_thing))
    for i in xrange(3):
        ts.append(gevent.spawn(fetch_url,i,with_proxy))
    gevent.joinall(ts)

if __name__=='__main__':
    run()

Diese Bilder zeigen das Ergebnis.

mit Proxy ausführen
ohne Proxy ausführen

Mit Proxy wird do_other_thing blockiert, bevor fetch_url fertig ist.
Ohne Proxy, funktioniert es gut. (Timeout-Fehler tritt auf, wegen der GFW)

Kann mir jemand helfen dieses Problem zu lösen? Vielen Dank!

Hilfreichster Kommentar

Meine beste Vermutung ist, dass Sie zu spät mit Monkeypatching beginnen. Wenn Sie gevent verwenden, müssen Sie zuerst monkeypatch , bevor Sie etwas anderes importieren. Wenn Sie dies später tun, besteht die Gefahr, dass alles zerstört wird, was einen from Import von den Dingen durchgeführt hat, die Monkeypatches erzeugen.

Können Sie versuchen, Ihren Import und Monkeypatch an den Anfang Ihrer Datei zu verschieben, bevor Sie etwas anderes tun?

Alle 3 Kommentare

Meine beste Vermutung ist, dass Sie zu spät mit Monkeypatching beginnen. Wenn Sie gevent verwenden, müssen Sie zuerst monkeypatch , bevor Sie etwas anderes importieren. Wenn Sie dies später tun, besteht die Gefahr, dass alles zerstört wird, was einen from Import von den Dingen durchgeführt hat, die Monkeypatches erzeugen.

Können Sie versuchen, Ihren Import und Monkeypatch an den Anfang Ihrer Datei zu verschieben, bevor Sie etwas anderes tun?

Ja, das Verschieben Ihres Imports und Monkeypatch an den Anfang Ihrer Datei hat mein Problem gelöst! Vielen Dank!

Dieser Vorschlag löst auch das Problem meines Projekts.
Ich habe 3 Dateien namens A,B,C und die Laufreihenfolge ist A->B->C. Ich benutze gevent in B, also füge ich monkeypatch in B hinzu, aber ich blocke mit Anfragen + Socken. Jetzt füge ich Monkeypatch ganz oben in A hinzu, es funktioniert jetzt großartig! Hoffe das hilft anderen!

Danke nochmal!

Freue mich zu helfen!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen