Requests: gevent + solicita bloques al usar calcetines

Creado en 10 feb. 2017  ·  3Comentarios  ·  Fuente: psf/requests

Utilizo python (2.7.6), gevnet (1.1.2), solicitudes (2.11.1) para hacer solicitudes http concurrentes, y funciona bien. Pero cuando agrego calcetines proxy a las solicitudes, se bloquea.

Este es mi codigo:

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()

Estas imágenes muestran el resultado.

ejecutar con proxy
ejecutar sin proxy

Con proxy, do_other_thing se bloqueará antes de que fetch_url termine.
Sin proxy, funciona bien. (se produce un error de tiempo de espera debido al GFW)

¿Alguien puede ayudarme a resolver este problema? ¡Muchas gracias!

Comentario más útil

Mi mejor suposición es que estás parcheando demasiado tarde. Al usar gevent, primero debe realizar el parche de mono, antes de importar cualquier otra cosa. Hacerlo más tarde corre el riesgo de romper cualquier cosa que haya hecho una importación from de las cosas que generan parches de mono.

¿Puede intentar mover su importación y parche de mono a la parte superior de su archivo antes de hacer cualquier otra cosa?

Todos 3 comentarios

Mi mejor suposición es que estás parcheando demasiado tarde. Al usar gevent, primero debe realizar el parche de mono, antes de importar cualquier otra cosa. Hacerlo más tarde corre el riesgo de romper cualquier cosa que haya hecho una importación from de las cosas que generan parches de mono.

¿Puede intentar mover su importación y parche de mono a la parte superior de su archivo antes de hacer cualquier otra cosa?

Sí, 'mover su importación y parche de mono a la parte superior de su archivo' resolvió mi problema. ¡Muchos gracias!

Esta sugerencia también resuelve el problema de mi proyecto.
Tengo 3 archivos llamados A, B, C, y la secuencia de ejecución es A-> B-> C. Yo uso gevent en B, así que agrego monkeypatch en B, pero bloqueo con peticiones + calcetines. Ahora agrego un parche de mono en la parte superior de A, ¡funciona muy bien ahora! ¡Espero que esto ayude a otros!

¡Gracias de nuevo!

¡Feliz de ayudar!

¿Fue útil esta página
0 / 5 - 0 calificaciones