Python3.6.0 版 Gevent 报错。。。

2017-01-18 16:33:22 +08:00
 zeke

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
3781 次点击
所在节点    Python
17 条回复
Reset
2017-01-18 16:48:59 +08:00
某处的递归调用死循环了
zeke
2017-01-18 16:59:18 +08:00
@Reset 关键这可能是框架的问题,不好解决
kkk330
2017-01-18 17:19:38 +08:00
先 patch...
hwwangwang
2017-01-18 17:29:57 +08:00
gevent 升级到 1.2a2 可以解决
zeke
2017-01-18 17:34:38 +08:00
@hwwangwang 我的 gevent 版本是 Version: 1.2.1 应该比 1.2a2 还新吧
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
2017-01-18 17:39:52 +08:00
1.2.1 没有问题的,你肯定是用了 1.1.2 或者更低的版本
hwwangwang
2017-01-18 17:42:41 +08:00
对的,姿势也不对。确实要在 `import requests` 之前 patch
zeke
2017-01-18 17:48:30 +08:00
@hwwangwang
@mengzhuo
惭愧啊。。。 (逃。。。
zeke
2017-01-18 17:50:05 +08:00
我在 python3.5 时运行是没问题的,升级到 3.6 就不行了,没想到是执行顺序问题
descusr
2017-01-18 20:08:59 +08:00
真的不想说你了,已经 python 3.6 了,直接用 async / await 不好吗? gevent 是个很危险的方案, python 的作者也很不喜欢 gevent 。我已经不用 gevent 了。
wwqgtxx
2017-01-18 20:19:04 +08:00
@descusr 我就想问问“ gevent 是个很危险的方案”这句话有依据么?而且不管怎么说 async / await 还是比 gevent 麻烦的多,而且还没办法兼容 python2.7 ,不要跟我说 py27 已经淘汰了,人家项目上就是要用,不是一个人可以左右的
sleshep
2017-01-18 20:24:54 +08:00
我就遇到过一个实习的,听我说 gevent 好用,结果发现用了几个月 patch 放后面,跟 TM 没用有啥区别
onlyice
2017-01-18 23:26:53 +08:00
@descusr python 作者很不喜欢 gevent ,这句话的出处可以给下吗?
beordle
2017-01-18 23:44:57 +08:00
@descusr 话说我们正在开发中的项目在用这个组合。之所以大家不用 async 只是因为大家都不熟悉。个人看法是 gevent 除了性能开销,基本没有什么大问题...只是之前 0.1.2 时遇到过坑而已。个人看法是这俩切换起来并不难,先用 gevent 。反倒是用状态机,异步回调还是 协程, async 这俩 是更需要决策的...差别太大了。关于 gevent 靠不靠谱的问题可以看下 libco 这种类似的东西,不过我个人认为,不用显式状态转移的根本原因是: 人员素质。或者是人类的认知本身就不太适合状态转移。
neoblackcap
2017-01-19 01:01:11 +08:00
gevent 怎么说呢?它帮你做了很多东西,但是这些东西当你真正想动的时候就不好搞,比如若是你一个协程运行了超级久,我自己就对这个协程很无力,我无法在外部有任何方法可以终结*这一个*协程。当然你若是要做到这一步的话,可能 asyncio 可以提供更多的明确的控制精度,而且生态可能更好。
gevent 的确是一个很不错的库,哪怕现在我司都上 Python3 ,我们还是很多项目在用着它。但是也是这样发现很多坑,比如一个 patch_all 过去,有时候正常运行的程序就变奇怪了。项目中用它, monkeypatch 的边界不好控制。
还有就是提一个小技巧,若是要用 gevent 的 monkeypatch ,那么 monkeypatch 就要越早打越好。有很多污染是可通过在函数基本 import gevent 来解决的。大家可以多多尝试
billgreen1
2017-01-19 09:36:54 +08:00
@onlyice google guido gevent

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/335427

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX