Python 2.7 Gunicorn + Flask,有大量的第三方服务 http 请求, requests 库阻塞导致出现性能瓶颈

2017-08-15 17:48:12 +08:00
 woostundy
该怎么优化呢?异步 http 客户端的库哪个比较靠谱?
14676 次点击
所在节点    Python
101 条回复
nullcc
2017-08-15 18:07:08 +08:00
换 tornado
aisk
2017-08-15 18:10:58 +08:00
直接上 gevent,代码都不用改,启动 gunicorn 的时候增加一个参数 -k gevent,自动帮你打 monkey patch 好 monkey patch 了。
woostundy
2017-08-15 18:11:21 +08:00
@nullcc 兄弟。。这成本有点大啊
woostundy
2017-08-15 18:16:33 +08:00
@aisk monkey patch 对 requests 现在还有效吗?我自己单开测试的时候还是阻塞的啊。
加了 httplib=True 会报已经不支持。
yonoho
2017-08-15 18:17:28 +08:00
@woostundy 有效啊,你咋测的
terrawu
2017-08-15 18:18:13 +08:00
gevent 和 requests 相性不和,楼主你用 httplib2 + gevent 吧,这坑我踩过的。
cloudyplain
2017-08-15 18:43:29 +08:00
gevent+requests 没问题。
troywinter
2017-08-15 19:41:32 +08:00
看 gunicorn 关于 worker 类别的文档,对于这种第三方请求服务有很具体的说明。
aisk
2017-08-15 22:58:08 +08:00
有效,你怎么测试的?如果你只看单个请求,看上去 requests 去请求远程接口的时候是阻塞的,不过如果这个时候还有其他请求过来,gunicorn 还能继续提供服务的。
gouchaoer
2017-08-15 23:06:15 +08:00
说换 tornado 的,你们去看看 tornado 的那个异步 httpclient 好用不,而且人家都用 flask 写了

我说结论吧,无解。。。换 go 语言吧

如果你使用 php,那 swoole/zanphp 可以做到同步方式来写异步 /协程
gouchaoer
2017-08-15 23:06:56 +08:00
你 flask 是同步的,用异步 httpclient 没用啊。。。
lerry
2017-08-15 23:13:00 +08:00
多开一些 worker

或者楼主你来看这个 https://github.com/kennethreitz/grequests
aisk
2017-08-15 23:52:16 +08:00
@gouchaoer 看了 gevent 你就懂了,flask 照样玩异步
EchoUtopia
2017-08-15 23:52:51 +08:00
gevent 可以把你的 python 同步阻塞代码自动变成异步的,patch_all 加个 httplib=True 参数,你看下在 gunicorn 下对应怎么处理
EchoUtopia
2017-08-15 23:54:38 +08:00
好吧,没看到你说不起作用了
SlipStupig
2017-08-16 00:09:21 +08:00
grequest
laoli2017
2017-08-16 09:46:58 +08:00
推荐 sanic,这个完全是基于 asyncio 来实现的,当然现在还不太成熟,但是性能上完全没问题(我做过压测,比 tomcat 强多了)。而且也不需要其他应用服务器,比如独角兽什么的。
mengskysama
2017-08-16 10:07:19 +08:00
gevent requests 一点毛病没有,参考 grequests。
yonoho
2017-08-16 10:19:18 +08:00
我猜楼主的测试是在一个请求里调用多次 requests,并期待并行执行的效果。但因为代码本身写成了同步顺序执行(多行或者循环),所以用了 monkey patch 也没用。这种情况下不改代码是不可能并行的,最简单的方法是依然使用 gevent worker,然后使用 #12 提供的 grequests 包重写第三方 http 请求部分,把这些 http 请求放在一起调用 grequests.map ( gevent.spawn ),就能实现并行加速。
alvinbone88
2017-08-16 11:01:19 +08:00
建议换 aiohttp

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

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

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

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

© 2021 V2EX