【问题标题】:gevent + requests blocks when using socks使用 socks 时 gevent + requests 块
【发布时间】:2017-06-28 16:06:35
【问题描述】:

我使用 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()

这些图片显示了结果。

run with proxy

run without proxy

使用代理,do_other_thing 将在 fetch_url 完成之前阻塞。

没有代理,它工作得很好。 (发生超时错误,因为GFW)

谁能帮我解决这个问题?非常感谢!

【问题讨论】:

  • 你试过grequests 吗?
  • @莫里斯·迈耶。不,我没有。因为 grequests 不能满足我项目的要求。还是谢谢你们!

标签: python python-requests gevent socks


【解决方案1】:

我也在 github 上问过这个问题。合作者非常好,帮我解决了这个问题。解决方案非常非常。

在执行任何其他操作之前将 gevent 导入和 monkeypatch 移动到文件的最顶部

我还有一个包含多个文件的项目,将导入和monkeypatch 移到第一个文件的最顶部解决了我的问题。

The issues at github.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-22
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 2020-12-24
    • 2013-03-12
    相关资源
    最近更新 更多