greenlet 之性能

2015-03-04 16:59:23 +08:00
 sujin190

发现在greenlet中调用函数比直接调用该函数,性能差距好大啊,python差不多有10倍左右,pypy差距更大,都快有100倍了,这差距怎么这么大啊?一直以为greenlet切换造成的性能损失很小呢

4601 次点击
所在节点    Python
16 条回复
ryanking8215
2015-03-04 21:27:32 +08:00
上次看到一个flask,flask+gevent,tornado,tornado+gevent的评测,测试结果是gevent只能锦上添花,不能雪中送炭。
anjianshi
2015-03-04 22:25:25 +08:00
greenlet 是解决阻塞,不是加速

它的应用场景是这样:
你要从某网站抓取 10万张图片,下载每张图片耗时 5 秒钟
如果你一个一个的抓,要花 10万 * 5秒
如果你开一万个线程,分10次抓取,那么理论上只要50秒就能完成,但是开这么多线程系统会因为过于频繁的线程调度而崩溃
而用 greenlet, 就可以只开1个线程,同时下载这10万张图片,所有的调度工作不由系统完成,而是在用户层面以更高效的方式进行
anjianshi
2015-03-04 22:29:22 +08:00
如果有兴趣,可以看看这篇有点长,但是讲的很好的文章:
http://segmentfault.com/blog/portal_qiniu_com/1190000001813992

或者看对应的视频:
http://boolan.com/lecture/1000001045
sujin190
2015-03-04 22:47:40 +08:00
@anjianshi 其实我关注的只是创建新协程和协程切换过程中的性能开销,我最初以为可能就相当于两次空寒数的调用,不过对比新线程的创建和切换的话,还是很高效的
sujin190
2015-03-04 22:49:23 +08:00
@ryanking8215 是的,gevent在flask中只能在连接部分提高效率,并不能提高逻辑处理的并发能力
clino
2015-03-04 22:55:08 +08:00
"发现在greenlet中调用函数比直接调用该函数,性能差距好大啊"
啥意思?到底是"在greenlet中调用函数"慢还是切换协程开销大?
sujin190
2015-03-04 22:57:10 +08:00
@clino 切换协程开销大,协程中执行函数的速度当然是一样的了
lilydjwg
2015-03-04 23:02:59 +08:00
@sujin190 不是说是栈复制吗,开销肯定大。不过它贵在可以 monkey patch 已有的代码。
sujin190
2015-03-04 23:06:04 +08:00
@lilydjwg 说的是,有时间去看下greenlet源码,学习学习
ruoyu0088
2015-03-05 06:39:58 +08:00
请帖测试代码
clino
2015-03-05 08:53:31 +08:00
https://code.google.com/p/coev/wiki/GreenletProblems
Conclusion
Greenlets have a huge number of potential side-effects. One can not rely on correct execution of code when greenlets are used. Their performance is also severely limited.
sujin190
2015-03-05 09:31:44 +08:00
@ruoyu0088 https://gist.github.com/snower/27d8fc414f073141376e
mac mini的时间消耗
0.00172591209412
0.0121078491211
0.00306391716003
1.49984288216
sujin190
2015-03-05 09:35:06 +08:00
好吧,协程切换时间消耗确实不高,创建协程比较高,这倒是比较奇怪
sujin190
2015-03-05 09:41:43 +08:00
@clino 好文
clino
2015-03-06 09:23:00 +08:00
@sujin190 如果只是创建协程开销比较大,你是不是针对优化一下就能有很大改善呢
sujin190
2015-03-06 10:42:18 +08:00
@clino 恩,相对于其它逻辑来说,这种消耗还是很小的,比如说数据库

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

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

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

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

© 2021 V2EX