Requests: gevent + solicita blocos ao usar meias

Criado em 10 fev. 2017  ·  3Comentários  ·  Fonte: psf/requests

Eu uso python (2.7.6), gevnet (1.1.2), solicitações (2.11.1) para fazer solicitações http simultâneas e funciona bem. Mas quando adiciono socks proxy às solicitações, ele bloqueia.

Este é o meu código:

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

Essas fotos mostram o resultado.

correr com proxy
correr sem proxy

Com o proxy, do_other_thing irá bloquear antes de fetch_url terminar.
Sem proxy, funciona bem. (ocorre erro de tempo limite, por causa do GFW)

Alguém pode me ajudar a resolver esse problema? Muito obrigado!

Comentários muito úteis

Meu melhor palpite é que você está remetendo muito tarde. Ao usar o gevent, você deve primeiro fazer o monkeypatch, antes de importar qualquer outra coisa. Fazê-lo mais tarde corre o risco de quebrar qualquer coisa que tenha feito uma importação from das coisas que geram monkeypatches.

Você pode tentar mover a importação e o monkeypatch para o início do arquivo antes de fazer qualquer outra coisa?

Todos 3 comentários

Meu melhor palpite é que você está remetendo muito tarde. Ao usar o gevent, você deve primeiro fazer o monkeypatch, antes de importar qualquer outra coisa. Fazê-lo mais tarde corre o risco de quebrar qualquer coisa que tenha feito uma importação from das coisas que geram monkeypatches.

Você pode tentar mover a importação e o monkeypatch para o início do arquivo antes de fazer qualquer outra coisa?

Sim, 'mover a importação e o monkeypatch para o topo do seu arquivo' resolveu meu problema! Muito obrigado!

Essa sugestão também resolve o problema do meu projeto.
Tenho 3 arquivos chamados A, B, C e a sequência de execução é A-> B-> C. Eu uso gevent em B, então adiciono monkeypatch em B, mas eu bloqueio com requisições + meias. Agora eu adiciono monkeypatch bem no topo de A, ele funciona muito bem agora! Espero que isso ajude outras pessoas!

Obrigado de novo!

Feliz por ajudar!

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

remram44 picture remram44  ·  4Comentários

NoahCardoza picture NoahCardoza  ·  4Comentários

iLaus picture iLaus  ·  3Comentários

Matt3o12 picture Matt3o12  ·  3Comentários

ghtyrant picture ghtyrant  ·  3Comentários