V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
zeke
V2EX  ›  Python

Python3.6.0 版 Gevent 报错。。。

  •  
  •   zeke · 2017-01-18 16:33:22 +08:00 · 3761 次点击
    这是一个创建于 2872 天前的主题,其中的信息可能已经有所发展或是发生改变。

    https://github.com/gevent/gevent/issues/903 有遇到过的吗

    这是python代码

    import requests
    from gevent import monkey
    monkey.patch_all()#加上这行就报错
    response = requests.get('https://www.baidu.com', timeout = 3600)
    print(response)
    

    报错信息如下

    Traceback (most recent call last):
      File "Desktop/ttt.py", line 5, in <module>
        response = requests.get('https://www.baidu.com', timeout = 3600)
      File "/usr/local/lib/python3.6/site-packages/requests/api.py", line 70, in get
        return request('get', url, params=params, **kwargs)
      File "/usr/local/lib/python3.6/site-packages/requests/api.py", line 56, in request
        return session.request(method=method, url=url, **kwargs)
      File "/usr/local/lib/python3.6/site-packages/requests/sessions.py", line 488, in request
        resp = self.send(prep, **send_kwargs)
      File "/usr/local/lib/python3.6/site-packages/requests/sessions.py", line 609, in send
        r = adapter.send(request, **kwargs)
      File "/usr/local/lib/python3.6/site-packages/requests/adapters.py", line 423, in send
        timeout=timeout
      File "/usr/local/lib/python3.6/site-packages/requests/packages/urllib3/connectionpool.py", line 594, in urlopen
        chunked=chunked)
      File "/usr/local/lib/python3.6/site-packages/requests/packages/urllib3/connectionpool.py", line 350, in _make_request
        self._validate_conn(conn)
      File "/usr/local/lib/python3.6/site-packages/requests/packages/urllib3/connectionpool.py", line 835, in _validate_conn
        conn.connect()
      File "/usr/local/lib/python3.6/site-packages/requests/packages/urllib3/connection.py", line 311, in connect
        cert_reqs=resolve_cert_reqs(self.cert_reqs),
      File "/usr/local/lib/python3.6/site-packages/requests/packages/urllib3/util/ssl_.py", line 264, in create_urllib3_context
        context.options |= options
      File "/usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 459, in options
        super(SSLContext, SSLContext).options.__set__(self, value)
      File "/usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 459, in options
        super(SSLContext, SSLContext).options.__set__(self, value)
      File "/usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 459, in options
        super(SSLContext, SSLContext).options.__set__(self, value)
      [Previous line repeated 323 more times]
    RecursionError: maximum recursion depth exceeded
    
    第 1 条附言  ·  2017-01-19 09:38:50 +08:00
    感谢回复, python 个人也只是业余爱好,没事写点简单的爬虫,因为不了解 patch 的原理,所以以为只要放在代码执行前 patch 好就可以,这几天再看下 async 吧
    17 条回复    2017-01-19 09:36:54 +08:00
    Reset
        1
    Reset  
       2017-01-18 16:48:59 +08:00
    某处的递归调用死循环了
    zeke
        2
    zeke  
    OP
       2017-01-18 16:59:18 +08:00
    @Reset 关键这可能是框架的问题,不好解决
    kkk330
        3
    kkk330  
       2017-01-18 17:19:38 +08:00
    先 patch...
    hwwangwang
        4
    hwwangwang  
       2017-01-18 17:29:57 +08:00
    gevent 升级到 1.2a2 可以解决
    zeke
        5
    zeke  
    OP
       2017-01-18 17:34:38 +08:00
    @hwwangwang 我的 gevent 版本是 Version: 1.2.1 应该比 1.2a2 还新吧
    mengzhuo
        6
    mengzhuo  
       2017-01-18 17:35:25 +08:00
    先 patch 再搞代码

    ```
    #!/bin/env python
    from gevent import monkey
    monkey.patch_all()
    import requests
    r = requests.get("https://www.baidu.com")
    print(r.status_code)
    ```
    hwwangwang
        7
    hwwangwang  
       2017-01-18 17:39:52 +08:00
    1.2.1 没有问题的,你肯定是用了 1.1.2 或者更低的版本
    hwwangwang
        8
    hwwangwang  
       2017-01-18 17:42:41 +08:00
    对的,姿势也不对。确实要在 `import requests` 之前 patch
    zeke
        9
    zeke  
    OP
       2017-01-18 17:48:30 +08:00
    @hwwangwang
    @mengzhuo
    惭愧啊。。。 (逃。。。
    zeke
        10
    zeke  
    OP
       2017-01-18 17:50:05 +08:00
    我在 python3.5 时运行是没问题的,升级到 3.6 就不行了,没想到是执行顺序问题
    descusr
        11
    descusr  
       2017-01-18 20:08:59 +08:00   ❤️ 1
    真的不想说你了,已经 python 3.6 了,直接用 async / await 不好吗? gevent 是个很危险的方案, python 的作者也很不喜欢 gevent 。我已经不用 gevent 了。
    wwqgtxx
        12
    wwqgtxx  
       2017-01-18 20:19:04 +08:00
    @descusr 我就想问问“ gevent 是个很危险的方案”这句话有依据么?而且不管怎么说 async / await 还是比 gevent 麻烦的多,而且还没办法兼容 python2.7 ,不要跟我说 py27 已经淘汰了,人家项目上就是要用,不是一个人可以左右的
    sleshep
        13
    sleshep  
       2017-01-18 20:24:54 +08:00   ❤️ 1
    我就遇到过一个实习的,听我说 gevent 好用,结果发现用了几个月 patch 放后面,跟 TM 没用有啥区别
    onlyice
        14
    onlyice  
       2017-01-18 23:26:53 +08:00 via Android
    @descusr python 作者很不喜欢 gevent ,这句话的出处可以给下吗?
    beordle
        15
    beordle  
       2017-01-18 23:44:57 +08:00 via Android
    @descusr 话说我们正在开发中的项目在用这个组合。之所以大家不用 async 只是因为大家都不熟悉。个人看法是 gevent 除了性能开销,基本没有什么大问题...只是之前 0.1.2 时遇到过坑而已。个人看法是这俩切换起来并不难,先用 gevent 。反倒是用状态机,异步回调还是 协程, async 这俩 是更需要决策的...差别太大了。关于 gevent 靠不靠谱的问题可以看下 libco 这种类似的东西,不过我个人认为,不用显式状态转移的根本原因是: 人员素质。或者是人类的认知本身就不太适合状态转移。
    neoblackcap
        16
    neoblackcap  
       2017-01-19 01:01:11 +08:00
    gevent 怎么说呢?它帮你做了很多东西,但是这些东西当你真正想动的时候就不好搞,比如若是你一个协程运行了超级久,我自己就对这个协程很无力,我无法在外部有任何方法可以终结*这一个*协程。当然你若是要做到这一步的话,可能 asyncio 可以提供更多的明确的控制精度,而且生态可能更好。
    gevent 的确是一个很不错的库,哪怕现在我司都上 Python3 ,我们还是很多项目在用着它。但是也是这样发现很多坑,比如一个 patch_all 过去,有时候正常运行的程序就变奇怪了。项目中用它, monkeypatch 的边界不好控制。
    还有就是提一个小技巧,若是要用 gevent 的 monkeypatch ,那么 monkeypatch 就要越早打越好。有很多污染是可通过在函数基本 import gevent 来解决的。大家可以多多尝试
    billgreen1
        17
    billgreen1  
       2017-01-19 09:36:54 +08:00   ❤️ 1
    @onlyice google guido gevent
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2575 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 04:39 · PVG 12:39 · LAX 20:39 · JFK 23:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.