Requests: 使用袜子时 gevent + requests 块

创建于 2017-02-10  ·  3评论  ·  资料来源: psf/requests

我使用 python(2.7.6)、gevnet(1.1.2)、requests(2.11.1) 并发 http 请求,效果很好。 但是当我向请求添加袜子代理时,它会阻塞。

这是我的代码:

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必须猴补丁,进口先天下之忧。 稍后这样做有破坏任何从 gevent 猴子补丁中导入from风险。

在做其他事情之前,您可以尝试将导入和monkeypatch 移动到文件的最顶部吗?

所有3条评论

我最好的猜测是你做猴子补丁太晚了。 当使用GEVENT必须猴补丁,进口先天下之忧。 稍后这样做有破坏任何从 gevent 猴子补丁中导入from风险。

在做其他事情之前,您可以尝试将导入和monkeypatch 移动到文件的最顶部吗?

是的,“将您的导入和monkeypatch 移到文件的最顶部”解决了我的问题! 非常感谢!

这个建议也解决了我项目的问题。
我有 3 个名为 A、B、C 的文件,运行顺序是 A->B->C。 我在 B 中使用 gevent,所以我在 B 中添加了monkeypatch,但我用请求+袜子阻止了。 现在我在 A 的最顶部添加了monkeypatch,现在效果很好! 希望这会帮助其他人!

再次感谢你!

乐于帮助!

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

jakul picture jakul  ·  3评论

eromoe picture eromoe  ·  3评论

avinassh picture avinassh  ·  4评论

ReimarBauer picture ReimarBauer  ·  4评论

justlurking picture justlurking  ·  3评论