使用socks时gevent +请求阻止

时间:2017-02-10 10:33:32

标签: python python-requests gevent socks

我使用python(2.7.6),gevnet(1.1.2),请求(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而发生超时错误)

任何人都可以帮我解决这个问题吗?非常感谢!

1 个答案:

答案 0 :(得分:0)

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

  

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

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

The issues at github.