Requests: gevent +は靴下を使用するときにブロックを要求します

作成日 2017年02月10日  ·  3コメント  ·  ソース: psf/requests

私はpython(2.7.6)、gevnet(1.1.2)、requests(2.11.1)を使用してhttpリクエストを並行させていますが、うまく機能しています。 しかし、リクエストにsocksプロキシを追加すると、ブロックされます。

これは私のコードです:

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

これらの写真は結果を示しています。

プロキシで実行
プロキシなしで実行

プロキシを使用すると、do_other_thingはfetch_urlが完了する前にブロックします。
プロキシがなければ、うまく機能します。 (GFWが原因で、タイムアウトエラーが発生します)

誰かが私がこの問題を解決するのを手伝ってくれる? どうもありがとう!

最も参考になるコメント

私の推測では、モンキーパッチの適用が遅すぎます。 geventを使用するときは、他のものをインポートする前に、まずモンキーパッチを適用する必要があります。 後でそれを行うと、monkeypatchesをgeventするものからfromインポートを行ったものを壊すリスクがあります。

他のことをする前に、インポートとモンキーパッチをファイルの一番上に移動してみてください。

全てのコメント3件

私の推測では、モンキーパッチの適用が遅すぎます。 geventを使用するときは、他のものをインポートする前に、まずモンキーパッチを適用する必要があります。 後でそれを行うと、monkeypatchesをgeventするものからfromインポートを行ったものを壊すリスクがあります。

他のことをする前に、インポートとモンキーパッチをファイルの一番上に移動してみてください。

ええ、「インポートとモンキーパッチをファイルの一番上に移動する」ことで私の問題は解決しました! どうもありがとうございます!

この提案は私のプロジェクトの問題も解決します。
私はA、B、Cと呼ばれる3つのファイルを持っており、実行シーケンスはA-> B-> Cです。 Bでgeventを使用しているので、Bにモンキーパッチを追加しますが、requests + socksでブロックします。 今、私はAの一番上にモンキーパッチを追加します、それは今うまくいきます! これが他の人に役立つことを願っています!

ありがとうございました!

お力になれて、嬉しいです!

このページは役に立ちましたか?
0 / 5 - 0 評価