Requests: gevent + bloque les requêtes lors de l'utilisation de chaussettes

Créé le 10 févr. 2017  ·  3Commentaires  ·  Source: psf/requests

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!

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 ?

Tous les 3 commentaires

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!

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

everping picture everping  ·  4Commentaires

jake491 picture jake491  ·  3Commentaires

avinassh picture avinassh  ·  4Commentaires

eromoe picture eromoe  ·  3Commentaires

remram44 picture remram44  ·  4Commentaires