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!
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!
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?