发现在greenlet中调用函数比直接调用该函数,性能差距好大啊,python差不多有10倍左右,pypy差距更大,都快有100倍了,这差距怎么这么大啊?一直以为greenlet切换造成的性能损失很小呢
1
ryanking8215 2015-03-04 21:27:32 +08:00
上次看到一个flask,flask+gevent,tornado,tornado+gevent的评测,测试结果是gevent只能锦上添花,不能雪中送炭。
|
2
anjianshi 2015-03-04 22:25:25 +08:00 2
greenlet 是解决阻塞,不是加速
它的应用场景是这样: 你要从某网站抓取 10万张图片,下载每张图片耗时 5 秒钟 如果你一个一个的抓,要花 10万 * 5秒 如果你开一万个线程,分10次抓取,那么理论上只要50秒就能完成,但是开这么多线程系统会因为过于频繁的线程调度而崩溃 而用 greenlet, 就可以只开1个线程,同时下载这10万张图片,所有的调度工作不由系统完成,而是在用户层面以更高效的方式进行 |
3
anjianshi 2015-03-04 22:29:22 +08:00
如果有兴趣,可以看看这篇有点长,但是讲的很好的文章:
http://segmentfault.com/blog/portal_qiniu_com/1190000001813992 或者看对应的视频: http://boolan.com/lecture/1000001045 |
4
sujin190 OP @anjianshi 其实我关注的只是创建新协程和协程切换过程中的性能开销,我最初以为可能就相当于两次空寒数的调用,不过对比新线程的创建和切换的话,还是很高效的
|
5
sujin190 OP @ryanking8215 是的,gevent在flask中只能在连接部分提高效率,并不能提高逻辑处理的并发能力
|
6
clino 2015-03-04 22:55:08 +08:00
"发现在greenlet中调用函数比直接调用该函数,性能差距好大啊"
啥意思?到底是"在greenlet中调用函数"慢还是切换协程开销大? |
10
ruoyu0088 2015-03-05 06:39:58 +08:00
请帖测试代码
|
11
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. |
12
sujin190 OP @ruoyu0088 https://gist.github.com/snower/27d8fc414f073141376e
mac mini的时间消耗 0.00172591209412 0.0121078491211 0.00306391716003 1.49984288216 |
13
sujin190 OP 好吧,协程切换时间消耗确实不高,创建协程比较高,这倒是比较奇怪
|