V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
sujin190
V2EX  ›  Python

greenlet 之性能

  •  
  •   sujin190 ·
    snower · 2015-03-04 16:59:23 +08:00 · 4578 次点击
    这是一个创建于 3550 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    16 条回复    2015-03-06 10:42:18 +08:00
    ryanking8215
        1
    ryanking8215  
       2015-03-04 21:27:32 +08:00
    上次看到一个flask,flask+gevent,tornado,tornado+gevent的评测,测试结果是gevent只能锦上添花,不能雪中送炭。
    anjianshi
        2
    anjianshi  
       2015-03-04 22:25:25 +08:00   ❤️ 2
    greenlet 是解决阻塞,不是加速

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

    或者看对应的视频:
    http://boolan.com/lecture/1000001045
    sujin190
        4
    sujin190  
    OP
       2015-03-04 22:47:40 +08:00
    @anjianshi 其实我关注的只是创建新协程和协程切换过程中的性能开销,我最初以为可能就相当于两次空寒数的调用,不过对比新线程的创建和切换的话,还是很高效的
    sujin190
        5
    sujin190  
    OP
       2015-03-04 22:49:23 +08:00
    @ryanking8215 是的,gevent在flask中只能在连接部分提高效率,并不能提高逻辑处理的并发能力
    clino
        6
    clino  
       2015-03-04 22:55:08 +08:00
    "发现在greenlet中调用函数比直接调用该函数,性能差距好大啊"
    啥意思?到底是"在greenlet中调用函数"慢还是切换协程开销大?
    sujin190
        7
    sujin190  
    OP
       2015-03-04 22:57:10 +08:00
    @clino 切换协程开销大,协程中执行函数的速度当然是一样的了
    lilydjwg
        8
    lilydjwg  
       2015-03-04 23:02:59 +08:00
    @sujin190 不是说是栈复制吗,开销肯定大。不过它贵在可以 monkey patch 已有的代码。
    sujin190
        9
    sujin190  
    OP
       2015-03-04 23:06:04 +08:00
    @lilydjwg 说的是,有时间去看下greenlet源码,学习学习
    ruoyu0088
        10
    ruoyu0088  
       2015-03-05 06:39:58 +08:00
    请帖测试代码
    clino
        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.
    sujin190
        12
    sujin190  
    OP
       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
        13
    sujin190  
    OP
       2015-03-05 09:35:06 +08:00
    好吧,协程切换时间消耗确实不高,创建协程比较高,这倒是比较奇怪
    sujin190
        14
    sujin190  
    OP
       2015-03-05 09:41:43 +08:00
    @clino 好文
    clino
        15
    clino  
       2015-03-06 09:23:00 +08:00
    @sujin190 如果只是创建协程开销比较大,你是不是针对优化一下就能有很大改善呢
    sujin190
        16
    sujin190  
    OP
       2015-03-06 10:42:18 +08:00
    @clino 恩,相对于其它逻辑来说,这种消耗还是很小的,比如说数据库
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3053 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 13:11 · PVG 21:11 · LAX 05:11 · JFK 08:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.