V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
dzmcs
V2EX  ›  问与答

Python django 框架有没有办法像 go 框架一样支持大并发呢?

  •  
  •   dzmcs · 2019-10-18 12:18:13 +08:00 · 4578 次点击
    这是一个创建于 1892 天前的主题,其中的信息可能已经有所发展或是发生改变。

    django+uwsgi+gevent,性能和 go 框架能差几个数量级?

    gevent 补丁替换了 io 支持协程,并发性能肯定不如 go,能不能使用比如腾讯的 libco,也用猴子补丁的方式,替换 io 操作,达到和 go 差不多数量级的并发效率呢?

    或者有没有其他什么方式?

    28 条回复    2019-10-19 06:58:32 +08:00
    rrfeng
        1
    rrfeng  
       2019-10-18 12:26:37 +08:00
    没有。
    ClericPy
        2
    ClericPy  
       2019-10-18 12:29:56 +08:00
    uvicorn + channels(asgi)?
    听过没用过, Django 的性能比 starlette 慢好几个数量级, 更别说 falcon... 然后 falcon 和 golang 还是差距很大, 放弃吧, 不打 C 补丁不加机器, 追不上 go 的
    love
        3
    love  
       2019-10-18 12:33:20 +08:00
    django 不是主要操作都是在数据库吗? 不用数据库有什么理由用 django?用了数据库主要性能点在数据库上了吧
    111111111111
        4
    111111111111  
       2019-10-18 12:36:07 +08:00 via Android
    异步 IO 只是改善了 IO,CPU 的效率没有改善
    lxml
        5
    lxml  
       2019-10-18 12:40:34 +08:00 via Android
    为啥非要用 python 写 web,超过一个人共同维护的代码动态语言总有一天踩到坑,前端同学都弃暗投明转 ts 了。
    dzmcs
        6
    dzmcs  
    OP
       2019-10-18 12:40:57 +08:00
    @ClericPy 做 web 比较菜,没听过这几个框架,就用了下 django,性能被吐槽,所以想找下有没有现成的改善办法。
    c 语言打补丁,如果能在 uwsgi 上打补丁,或者语言层面的补丁能提升并发性能也好啊,纯好奇,没有大并发经验。
    感谢!
    dzmcs
        7
    dzmcs  
    OP
       2019-10-18 12:42:48 +08:00
    @love 确实,瓶颈其实都在数据库。就是好奇,python 有没有办法也跑大的并发。谢谢
    dzmcs
        8
    dzmcs  
    OP
       2019-10-18 12:43:58 +08:00
    @lxml 因为菜啊,只会 c 和 python,懒得学其他语言和框架
    dzmcs
        9
    dzmcs  
    OP
       2019-10-18 12:46:37 +08:00
    @111111111111 用好的异步 io 或者协程,其他瓶颈的地方用 c 打补丁,能否和 go 比性能?
    malusama
        10
    malusama  
       2019-10-18 12:47:05 +08:00   ❤️ 2
    以前也总是想着这么提高并发。后来发现做的站根本没人访问。。
    Reficul
        11
    Reficul  
       2019-10-18 12:48:24 +08:00
    现在是有啥问题执着增加并发,为啥觉得“并发”是瓶颈,啥才是“并发”?

    现在是 CPU 密集了,IO 密集了,还是数据库扛不住了?
    dzmcs
        12
    dzmcs  
    OP
       2019-10-18 12:53:28 +08:00
    @Reficul 好奇而已
    ClericPy
        13
    ClericPy  
       2019-10-18 12:54:32 +08:00
    @dzmcs 走协程是在 IO 开销那边尽可能的减少资源浪费, 然而与 C 语言写的东西的瓶颈是没办法追上的, Django 全家桶的概念就是一把梭, 把常用代码打包好直接像乐高一样插起来就用了, 性能方面依靠 nginx 负载均衡多搞几台机器, 具体优化可以去看看 Instagram 他们怎么通过手动 GC 等方法优化 Django 来撑住高并发

    C 语言打在 uwsgi 也没法突破那个瓶颈的, japronto 那个框架看起来进军 Benchmark 第一梯队, 里面其实很多 tricker 手段, 我是不敢上生产环境, vibora 框架虽然快, 但是里面绝大部分代码都是 C 写的, 所以不算纯 py 项目了, Django 在底层实现上就吃了亏, 很难追得上的. falcon 没用过, 也没看过源码, 不知道为啥那么快......

    至于性能被吐槽, python 本来就被吐槽性能了, Django 只是在 py 框架里更差, 不过新版本支持 channels 的 asgi 实现以后, 提高了一些

    附 Benchmark 的某个项目, 以及 fastapi 那边看的一个结果

    https://github.com/the-benchmarker/web-frameworks

    https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7
    love
        14
    love  
       2019-10-18 12:55:00 +08:00
    @dzmcs 基本上 99.9%的公司都不会困扰于语言的性能,你是不是杞人忧天了。豆瓣早期的时候听说就一个 py web 服务机器就撑了非常大的用户数,你到了这个用户量再考虑其它。
    Reficul
        15
    Reficul  
       2019-10-18 13:00:09 +08:00
    @dzmcs

    先考虑架构能不能扩展,在考虑语言性能把。

    非要说的话,CPU 密集型就 Profile 之后改成 C 模块,IO 密集的话还得看是连接多还是数据量大,考虑怎么优化。。。

    比较语言没啥用,还不如看看为啥这个语言慢,哪个适合哪个,知道背后的原来所以然。 在合适的场景用合适的技术。
    dzmcs
        16
    dzmcs  
    OP
       2019-10-18 13:07:32 +08:00
    @ClericPy
    谢谢!
    纯粹是好奇,优化 GC 能全局优化,但是要有一定水平,效益肯定最大。但是即便没有优化语言的水平,真有性能问题,打 c 补丁总能赶上主流框架。多谢分享
    dzmcs
        17
    dzmcs  
    OP
       2019-10-18 13:14:14 +08:00
    @Reficul
    没机会遇到性能瓶颈,就是好奇,谢谢

    cpu 密集了,打 c 补丁,io 密集了,不知道能不能调用一下高性能的 c 协程库?如果可以调用腾讯的 libco,某些场合,是不是可以追上 go 的性能?

    如果 c 既能解决 cpu 密集,也能解决 io 密集,胶水的作用完成的岂不更好。
    Vegetable
        18
    Vegetable  
       2019-10-18 13:19:18 +08:00
    Django 的架构应该是不太行,还是要用协程,基于 event loop 的方案,比如 tornado 和 sanic 这种,高并发是能解决的
    ClericPy
        19
    ClericPy  
       2019-10-18 13:42:02 +08:00
    @dzmcs 上面那些劝你别研究这个的估计平时也是被人劝着先做好业务别纠结过早优化过, 不用在意, 都是好心

    用 C 解决问题就是那个 vibora 框架, 你看看他们源码可以稍微了解一点, 至于想上第一梯队的性能, 还是得换语言, 甚至考虑下 pypy 也好, 不过用过 pypy 的朋友似乎都劝退了... 看那个 Benchmark, golang 都进不去第一梯队, Nim 语言倒是让我瞎了一下

    目前中小企业用 golang 一方面是请个实习生就可以抗住一些需求, 不像 python, 看起来学一周就能开发东西, 实际上很多常识性的坑比 golang 要多. 稍微大点的企业选择 golang 可能也是用 python 的时候绞尽脑汁, 但效果都不理想, 才不得已放弃的, 就像某乎, 在 python 上优化了很多很多地方, 实际上反而不如整个迁 go 来的省心, 毕竟现在都讲个效率, 动作慢了连口屎都吃不上热乎的

    目前的现状是, python 已经可以抗住绝大部分需求了, 做大做强的话, 需要的 python 高级程序员太贵, 从成本收益和后期维护上, 一百个 java 程序员可能只写出一种代码, 而一百个 python 开发者指不定能写出一百以上个变种, 语法糖太多, 不搞统一规范就是在玩屎山... golang 目前来说不是说太优秀, 只是其他对手问题太多

    表明立场, 我喜欢 python
    zhangxudong
        20
    zhangxudong  
       2019-10-18 14:00:47 +08:00
    sujin190
        21
    sujin190  
       2019-10-18 14:08:49 +08:00
    python io 并不是最大限制,语言自身性能本来就比不了静态编译型的 go,这个没办法
    Reficul
        22
    Reficul  
       2019-10-18 14:08:51 +08:00
    @dzmcs 专业的事情给专业的做,可以减少成本
    lbp0200
        23
    lbp0200  
       2019-10-18 14:12:29 +08:00
    多加机器就是了,go 5 台,Python 用 1000 台,都可以顶住
    optional
        24
    optional  
       2019-10-18 14:16:37 +08:00
    现在已经不是 5 年前了。 选更合适的语言和框架更重要。
    julyclyde
        25
    julyclyde  
       2019-10-18 16:39:24 +08:00
    django 只是开发框架,并不自带正经的运行服务
    和 go 那种语言层面就支持的,是两码事
    lozzow
        26
    lozzow  
       2019-10-18 18:03:31 +08:00
    不过 python 写 web,项目大了加上多人维护的话,改起来就像吃屎一样(如果在加上没有文档的一股浓浓的 JAVA 风的公司自研框架的话,就不是像吃屎那么简单了)
    robinlovemaggie
        27
    robinlovemaggie  
       2019-10-18 18:15:13 +08:00
    都别争了:除了汇编,剩下的都是垃圾语言~
    iPhoneXI
        28
    iPhoneXI  
       2019-10-19 06:58:32 +08:00 via Android
    目前最不折腾的方式就是换使用 asyncio 的框架,然后加个 uvloop 扩展,
    性能当然比 go 还是差一些,但是比 Django 本身快太多,
    还要追求更高性能的话,别用 Python 了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2940 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 14:03 · PVG 22:03 · LAX 06:03 · JFK 09:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.