V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
ipconfiger
V2EX  ›  分享创造

让 tornado 的异步任务更加轻松

  •  1
     
  •   ipconfiger · 2015-04-16 01:46:28 +08:00 · 4735 次点击
    这是一个创建于 3539 天前的主题,其中的信息可能已经有所发展或是发生改变。
    23 条回复    2015-04-17 22:48:21 +08:00
    9hills
        1
    9hills  
       2015-04-16 09:25:22 +08:00 via iPhone
    我的选择是把所有任务都扔rq
    sujin190
        2
    sujin190  
       2015-04-16 09:31:50 +08:00
    这样效率太低了吧,tornado在web方面的优势都被弄的没了
    ipconfiger
        3
    ipconfiger  
    OP
       2015-04-16 09:46:42 +08:00
    @sujin190 一句慢查询就把整个进程都堵塞了,异步扔到队列到远程主机跑当然省事,但是获取返回值呢?有些服务还是需要获取返回值的。这个方案也说不上最完美,但是好歹本地的后端进程耗尽的话也就堵塞那几个耗时的要放后端进程处理的请求,其余的请求是畅通的。这里不是要取代tornado现有的方式,而是提供一个额外的处理耗时请求的方法而已,比如上传了图片要缩略啊,切图啊。或者转发到七牛又拍什么的。
    futursolo
        4
    futursolo  
       2015-04-16 10:14:30 +08:00
    你这个和tornado自带的tornado.concurrent.run_on_executor以及return_future的方法有什么区别?
    ipconfiger
        5
    ipconfiger  
    OP
       2015-04-16 10:26:26 +08:00
    @futursolo


    线程...... GIL啊 concurrent.futures ,这个只能在3下用
    wph95
        6
    wph95  
       2015-04-16 10:36:35 +08:00
    @ipconfiger 我现在是用celery+rq实现了异步任务,多机扩展很方便,返回值通过rq来传递也不算麻烦。
    不知道torasync相较Celery有没有杀手锏级别的特点
    ipconfiger
        7
    ipconfiger  
    OP
       2015-04-16 10:39:15 +08:00
    @wph95 安装方便,使用方便,0配置
    futursolo
        8
    futursolo  
       2015-04-16 10:47:31 +08:00   ❤️ 1
    @ipconfiger
    1. 没事,偶都是3.2.5 +的
    2. Python2 执行·pip install features·就可以安装features。。。(你没看括号里的内容吗。。。)
    3. Callback is deprecated, simply call and yield its Future. -- From Motor
    futursolo
        9
    futursolo  
       2015-04-16 10:54:46 +08:00
    @futursolo 突然发现自己手滑打错了,应该是futures。。。
    scys
        10
    scys  
       2015-04-16 11:01:24 +08:00 via Android
    3.4效率很低…就是编写方便多了
    Shared
        11
    Shared  
       2015-04-16 11:57:12 +08:00
    @scys 效率低是指哪方面,有引用来源吗?
    sujin190
        12
    sujin190  
       2015-04-16 13:59:56 +08:00
    @ipconfiger 查询数据库的话一般都有异步版了吧,传七牛的话异步的http client不是更好用么?如果是要处理大量的缩略图的话,不是应该tornado进程先完成保存文件,接着通知后端服务完成处理么?这样做反而可控性不好和效率也起不来
    ipconfiger
        13
    ipconfiger  
    OP
       2015-04-16 14:27:44 +08:00
    @sujin190 你可以想得更复杂一点,先各种数据库判断处理,再传七牛,传完以后再各种处理等等
    no13bus
        14
    no13bus  
       2015-04-16 14:44:57 +08:00
    @wph95 celery是队列 rq也是队列,为什么要2个一起用呢?rq的功能 celery都有,并且能并行处理task
    ipconfiger
        15
    ipconfiger  
    OP
       2015-04-16 14:54:27 +08:00
    tornado大版本都已经4了,期间无论是官方的还是各路大仙自己倒腾的,对于这个痛点也有很多不同的方案,我只是针对自己实际使用的时候遇到的一些问题给出了一个方案,所以不一定适合所有人,其实也没有万能解,方案的得失大家可以一起讨论,放出来只是希望有需求的同学能方便一下,仅此而已
    wph95
        16
    wph95  
       2015-04-16 15:24:12 +08:00
    @no13bus celery 是Distributed Task Queue 需要Brokers 我不过是用rq做Brokers
    celery本身只是一个分配系统 自身不是队列
    no13bus
        17
    no13bus  
       2015-04-16 15:26:04 +08:00
    @wph95 嗯。知道了。原来。我是用redis做broker的。
    kernel1983
        18
    kernel1983  
       2015-04-16 16:14:16 +08:00
    我们的做法是消灭慢查询
    sujin190
        19
    sujin190  
       2015-04-16 16:18:11 +08:00
    @ipconfiger 就算是是如此还是明显tornado自身更省资源更快吧,用greenlet来切换同步io操作都要比多进程好的多
    sujin190
        20
    sujin190  
       2015-04-16 16:18:51 +08:00
    @kernel1983 说的是消灭慢查询才是王道
    timonwong
        21
    timonwong  
       2015-04-16 16:41:44 +08:00
    @sujin190 不是所有处理都是IO密集,IO密集还好说,CPU密集不分个进程出来等于卡住。
    billzhuang
        22
    billzhuang  
       2015-04-17 10:11:00 +08:00
    不管是不是慢查询,只要是异步IO的就好啦
    mucid
        23
    mucid  
       2015-04-17 22:48:21 +08:00
    看了下代码,我还是自己开线程处理吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   995 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 18:47 · PVG 02:47 · LAX 10:47 · JFK 13:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.