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