Django 异步请求? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
linkbg
V2EX    Django

Django 异步请求?

  •  
  •   linkbg 2017-05-19 15:36:40 +08:00 4259 次点击
    这是一个创建于 3118 天前的主题,其的信息可能已经有所发展或是发生改变。

    不知道这样问合不合理。异步处理。

    场景是这样: 有个请求需要查询数据库,然后数据量比较大,就使用了 limit。速度快了,但是有一部分,数据需要共享。比如统计这部分类型的数量。加入 limit 之后统计的数量就是 limit 参数的数量。

    目前想法是,在这个请求返回之后后台执行一个查询全部的。

    搜到的解决方案是 django-celery。 不知道有没有其他比较轻的解决方案呢? 谢谢

    17 条回复    2017-05-21 19:57:34 +08:00
    lovedboy
        1
    lovedboy  
       2017-05-19 15:43:44 +08:00   1
    fork 进程来做这件事啊==
    linkbg
        2
    linkbg  
    OP
       2017-05-19 15:46:34 +08:00
    @lovedboy 我不是很理解如何使用,因为 request 请求,不是要等到所有处理完才能返回页面吗?
    KIDJourney
        3
    KIDJourney  
       2017-05-19 15:48:36 +08:00
    @lovedboy 你觉得 fork 是轻量级的解决方案吗。

    在 python 里因为 GC 的原因,fork 基本是必定触发 COW 的 write,每次都起个进程做事情对 python 来说负担太大了。
    KIDJourney
        4
    KIDJourney  
       2017-05-19 15:49:23 +08:00
    @linkbg 感觉你的需求说的不够明确啊,数据需要共享是什么意思?
    111111111111
        5
    111111111111  
       2017-05-19 15:49:36 +08:00
    没懂你要做什么
    >比如统计这部分类型的数量
    可再 view 里查询 User.objects.filter().count()
    111111111111
        6
    111111111111  
       2017-05-19 15:50:37 +08:00
    @111111111111 #5 居然直接发了
    一个请求可以返回两部分数据
    当前 limit 数据内容 + 全部的 count,分开查,不影响
    mansur
        7
    mansur  
       2017-05-19 15:52:50 +08:00   1
    请求插队列里,然后 while 去都 redis 约定的 key,开个后台进程,专门处理这个队列,查询完了通过约定的 key 存入 redis,那边读到这个 key 后就可以返回给用户了
    111111111111
        8
    111111111111  
       2017-05-19 15:54:27 +08:00
    @mansur #7 那边没读到这个 key 怎么办
    mansur
        9
    mansur  
       2017-05-19 15:56:20 +08:00
    一直 while,sleep 一秒或几秒,设个超时时间,超过了就返回查询超时
    linkbg
        10
    linkbg  
    OP
       2017-05-19 15:59:03 +08:00
    @KIDJourney
    @111111111111

    有这么一条查询
    ```
    db.tests.find({},{'age':14}).limit(100)
    ```
    上面的查询可以返回:住址,城市,来源。
    数据共享,说法可能不准确
    上面的结构会有这样的统计
    ```
    city
    beijing 99
    shanghai 1
    ```
    但是想要的是满足年龄=14 的,城市是北京的总数!

    @111111111111 提到的分开查,这样就得等到所有查询完成才能返回页面。这样 limit 就没有用了。
    jimzhong
        11
    jimzhong  
       2017-05-19 16:03:41 +08:00
    @mansur

    赞同这种做法。提供两个 API,一个用于发起查询,另一个用于获取查询状态 /结果。查询操作交给任务队列完成。
    JasperYanky
        12
    JasperYanky  
       2017-05-19 16:09:11 +08:00
    Huey 可能是最轻量级的 Celery > RQ > Huey
    awanabe
        14
    awanabe  
       2017-05-19 16:17:31 +08:00
    celery 挺好的方案, 丢进去异步处理,搞一个长连接或者轮询去查最终结果输出的地方,比如数据库,Redis, 查到了就展现不就好了么。。
    PythoneerDev6
        15
    PythoneerDev6  
       2017-05-19 20:34:39 +08:00
    @KIDJourney 赞成。 其次 Python 的 GIL 就是一个巨大坑点。没太大卵用。要 fork 来解决这个问题,简直就是增加 Python 的负担。
    sagaxu
        16
    sagaxu  
       2017-05-20 01:16:29 +08:00
    @PythoneerDev6 GIL 对 cpu 密集型才有影响,db 对 python 而言只是在等 io,显然 GIL 不会有任何影响
    lovedboy
        17
    lovedboy  
       2017-05-21 19:57:34 +08:00
    @PythoneerDev6 Fork 和 GIL 有啥关系....
    @KIDJourney 对于不是频繁执行的,我觉得 fork 总比引入 celery 要好==
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1161 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 23:38 PVG 07:38 LAX 15:38 JFK 18:38
    Do have faith in what you're doing.
    ubao msn 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