J'utilise python(2.7.6),gevnet(1.1.2),requests(2.11.1) pour rendre les requêtes http simultanées, et cela fonctionne bien. Mais lorsque j'ajoute un proxy de chaussettes aux requêtes, cela bloque.
C'est mon 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()
Ces images montrent le résultat.
exécuter avec proxy
exécuter sans proxy
Avec le proxy, do_other_thing bloquera avant que fetch_url ne soit terminé.
Sans proxy, ça marche bien. (une erreur de délai d'attente se produit, à cause du GFW)
Quelqu'un peut-il m'aider à résoudre ce problème? Merci beaucoup!
Ma meilleure hypothèse est que vous êtes en train de faire le singe trop tard. Lorsque vous utilisez gevent, vous devez d' abord effectuer un Monkeypatch avant d'importer quoi que ce soit d'autre. Le faire plus tard risque de casser tout ce qui a fait une importation from
partir des choses qui génèrent des patchs de singe.
Pouvez-vous essayer de déplacer votre import et votre monkeypatch tout en haut de votre fichier avant de faire autre chose ?
Ouais, " déplacer votre import et votre monkeypatch tout en haut de votre fichier " a résolu mon problème ! Merci beaucoup!
Cette suggestion résout également le problème de mon projet.
J'ai 3 fichiers appelés A,B,C, et la séquence d'exécution est A->B->C. J'utilise gevent en B, donc j'ajoute monkeypatch en B, mais je bloque avec des requêtes + chaussettes. Maintenant, j'ajoute monkeypatch tout en haut de A, ça marche très bien maintenant ! J'espère que cela aidera d'autres!
Merci encore!
Heureux d'aider!
Commentaire le plus utile
Ma meilleure hypothèse est que vous êtes en train de faire le singe trop tard. Lorsque vous utilisez gevent, vous devez d' abord effectuer un Monkeypatch avant d'importer quoi que ce soit d'autre. Le faire plus tard risque de casser tout ce qui a fait une importation
from
partir des choses qui génèrent des patchs de singe.Pouvez-vous essayer de déplacer votre import et votre monkeypatch tout en haut de votre fichier avant de faire autre chose ?