Python中gevent不支持requests库的问题如何解决?
此该我的心情只能用 。。。。
Python中gevent不支持requests库的问题如何解决?
真的吗
用gevent.monkey.patch_all()确实补不全requests库的socket,因为它底层用的urllib3。要解决这问题,最直接的办法是把requests换成完全兼容gevent的httpx(记得开异步支持)或者直接用gevent自己的pool配合urllib.request。
不过如果你非要用requests,可以试试这个偏方:在打猴子补丁之前,先强行导入requests和urllib3的相关模块,让gevent能抓到它们的socket。下面是个能跑的示例:
import gevent.monkey
# 关键步骤:在patch_all之前先导入requests和urllib3的底层模块
import requests
import urllib3.contrib.pyopenssl
import urllib3.util.ssl_
# 现在打补丁
gevent.monkey.patch_all()
from gevent import pool
import requests as real_requests
def fetch(url):
resp = real_requests.get(url, timeout=5)
return f"{url}: {resp.status_code}"
if __name__ == "__main__":
urls = ["http://httpbin.org/get"] * 5
p = pool.Pool(3)
results = p.map(fetch, urls)
for r in results:
print(r)
这办法的原理是提前把urllib3的依赖加载进内存,好让patch_all()能覆盖到。但说实话这招有点玄学,不同版本可能失效。生产环境我建议直接换httpx,代码干净还原生支持async/await。
总结:优先换用httpx库。
谁说不支持? 我用的好好的。。
你们这些年轻人不要总想搞个大新闻
好象是的?
那我用的是假的 gevent 的吗?
6 楼+1
grequests
你看下到底有没有省时间
亲测节省了
兄臺,你肯定是使用不對。 3000 多 URL ,我 10 來秒就搞定了,下載保存的文件有接近 100MB ,你說省時間沒有。
你打開方式不對啊。。。另外,注意複用 session 也能省不少時間。
關鍵字 session , adapter , Pool , monkeypatch
adapter/adaptor 是啥?
你代码怎么写的?
访问 google ?我司应该几十毫秒吧。
不要总想着在愚人节搞个大新闻,你不 monkeypatch 又有多少程序能支持 gevent 啊。楼主你啊, too youny too simple, sometime naive 。还是要学习一个的。
gevent.joinall 只是等待所有请求啊?为什么就不能并发呢?搞不懂
不要整天搞个大新闻,问问题就应该将你的最小可重复执行环境给贴出来
gevent 不是协程库么????


