Tornado 官方怎么不好好维护一个 sql 的异步数据库驱动? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Gem
V2EX    Tornado

Tornado 官方怎么不好好维护一个 sql 的异步数据库驱动?

  •  
  •   Gem 2015-11-05 17:18:38 +08:00 8059 次点击
    这是一个创建于 3629 天前的主题,其中的信息可能已经有所发展或是发生改变。
    虽然这样显得 Tornado 更加纯粹了,可是在用户实际使用起来,还是有很多不便,社区里面也没有比较高 star 的实现。
    24 条回复    2015-11-06 21:21:14 +08:00
    janxin
        1
    janxin  
       2015-11-05 17:35:38 +08:00
    Tornado 官方没维护其他的库吧,从维护上我看也就作者一个人主要维护而已。

    其实现在我们也遇到了异步驱动的问题,除了 mongodb 官方维护的 motor 的库意外,其他的大概也就能数得上 PyMySQL 官方维护的 Tornado-PyMySQL 了。其他的偶尔都会有坑....

    ORM 的支持更加无力...我都打算自己搞了
    Gem
        2
    Gem  
    OP
       2015-11-05 17:45:27 +08:00
    ORM 更不用想了。
    forging2012
        3
    forging2012  
       2015-11-05 17:47:35 +08:00 via Android
    停播了
    janxin
        4
    janxin  
       2015-11-05 17:50:33 +08:00
    @Gem 我已经在想 Tornado 纯做 Web 框架,用 Gevent 加持上同步库了 2333
    lovedboy
        5
    lovedboy  
       2015-11-05 18:20:19 +08:00
    @janxin 我就是这样的。哈哈。 gevent+tornado+pymongo+pymysql
    Gem
        6
    Gem  
    OP
       2015-11-05 19:44:46 +08:00
    @janxin
    alex8224
        7
    alex8224  
       2015-11-06 00:02:22 +08:00
    好吧,最近我在用 storm, 也在用 pymysql,准备加上 storm 的异步支持的,但是思考后决得太难看了。没动手。
    还是觉得 gevent 自然一点。
    janxin
        8
    janxin  
       2015-11-06 00:11:20 +08:00 via iPhone
    @alex8224 yield from 方式觉得还不如干脆 yield 更好,所以我很期待 3.5+推广开,这样就很好了,而且 gevent 也可以支持关键字
    est
        9
    est  
       2015-11-06 00:22:43 +08:00
    我记得好像是 @ipconfiger 同志说过, tornado 认为,如果你数据库卡比得都需要异步了,那么怎么异步都没用的。因为数据库其实不怎么能抗并发和耗时的处理。。比如 MVCC 把一行锁等 commit ,你另外一个异步来修改这行,照样需要 locking 等待的。
    alex8224
        10
    alex8224  
       2015-11-06 00:31:01 +08:00
    @janxin sqlalchemy 的作者写了一篇 <<Asynchronous Python and Databases>> 你可以看看

    http://techspot.zzzeek.org/
    ipconfiger
        11
    ipconfiger  
       2015-11-06 01:20:46 +08:00
    @est 这个观点是 tornado 作者的,我从不解到赞同到打算突破到继续赞成,经过了多年的心理斗争和努力,事实上,异步并不是一切的终极答案,大多数时候我们在未经思考的时候脱口而出:让我们异步起来吧。其实只是为了图方便而已。
    ipconfiger
        12
    ipconfiger  
       2015-11-06 01:32:10 +08:00   1
    另外 gevent 也不是正确的解法,不管你怎么纤程,一个数据库的 connection 上是只能跑一个 statement 的,那么当一个查询 block 的时候,你也只能启动一个新的 connection 去执行新的 statement ,然后如果一条慢 SQL 要跑 1 秒,那么在这个时候狗屎运爆发了有 1000 个并发请求都在执行这条 SQL ,那么结果就是启动了 1000 个数据库的 connection ,超过 MySQL 的 max_connection 设置数的话,就会开始拒绝连接了。

    感兴趣的话去网上随便搜索一点 MySQL 的配置优化方案,有没有数据库开挂上高并发的优化案例。
    janxin
        13
    janxin  
       2015-11-06 08:43:39 +08:00 via iPhone
    @est
    @alex8224
    @ipconfiger
    谢谢各位解惑
    ryanking8215
        14
    ryanking8215  
       2015-11-06 08:59:00 +08:00
    @est 但是至少 tornado 还能快速响应其他请求(非数据库相关请求),如果业务上没需求的话,这个也然并卵
    sujin190
        15
    sujin190  
       2015-11-06 09:25:15 +08:00
    我觉得 Tornado 使用异步操作数据库,并不在于 1000 个并发过来,就真的 1000 个查询到数据库,同时查询肯定有上限的,使用异步只是为了不让 tornado 进程处于 iowait 状态,可以减少进程的切换,同时也可以更快的处理非数据库相关的请求,一般对于 web 查询多余读写的情景来说,数据库查询确实会很快,也正是如此数据库到 web 服务器的网络传输时间消耗也占到了整个查询时间的很大比重了吧
    lovedboy
        16
    lovedboy  
       2015-11-06 09:27:29 +08:00
    @ipconfiger 我反正是为了写法爽,不想用 yield,callback 之类。
    fordoo
        17
    fordoo  
       2015-11-06 09:50:09 +08:00
    好多人从 python 转向 golang ,可能就是这个原因吧:同步 gevent 要踩坑,异步下库跟不上。
    aiqier
        18
    aiqier  
       2015-11-06 10:03:19 +08:00
    我的理解是:其实在怎么异步,到数据库那一层都是阻塞的,意义不大。你的服务是异步的够了,
    robertding
        19
    robertding  
       2015-11-06 10:44:31 +08:00
    @janxin tornado 做纯 web 框架感觉没什么优势, 扩展性很不好
    jjx
        20
    jjx  
       2015-11-06 10:54:52 +08:00   1
    异步就老老实实的用 消息队列+多 worker 模式, 在 worker 中, 同步也行, 用 gevent 也行, 像 tornado 的典型方案应该是这样的

    多进程 tornado + pyzmq + proxy +多 worker

    这是在生产环境中用的, 要保证 tornado 中要么用异步客户端,要不直接转发到外部进程或消息队列

    当然, 在一台服务器上 worker,不行, tornado 接入再多的连接又有什么用, 这种思路本身就是分布式的,要求你的数据库也能分布, 传统的 db 难度得确高了些
    sujin190
        21
    sujin190  
       2015-11-06 12:30:41 +08:00
    测试了一下, tornado 使用异步数据库操作, sys 使用率可以低 50%,配合 pypy ,在 MySQL 基本没什么数据,读的情况下可以到 11000 每秒处理数,同步数据库操作 7000 左右, MySQL 毫无压力, cpu 使用率不高于 18%,并发的话, ab 同步 400 左右正常, 500 跪了,异步 1000 毫无压力
    est
        22
    est  
       2015-11-06 13:01:06 +08:00
    @sujin190 可以统计下 python 项目里的 view 。我觉得不调用 db 的 view 不存在。。。。好多 session 都是存 mysql 的。
    ipconfiger
        23
    ipconfiger  
       2015-11-06 16:48:26 +08:00
    @sujin190 你再多点请求的话,就会发现数据库垮丝了,能支撑的 QPS 极限是一致的,当然在某些区间异步确实能带来肉眼能看见的提升
    alex8224
        24
    alex8224  
       2015-11-06 21:21:14 +08:00
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2728 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 559ms UTC 09:48 PVG 17:48 LAX 02:48 JFK 05:48
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86