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

Django 异步请求?

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

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

    场景是这样: 有个请求需要查询数据库,然后数据量比较大,就使用了 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
    JasperYanky
        13
    JasperYanky  
       2017-05-19 16:10:33 +08:00
    另外 有些操作前端异步可能更好点,直接返回部分数据,后续数据前端到 API 里去查~
    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   ·   实用小工具   ·   1477 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 17:27 · PVG 01:27 · LAX 09:27 · JFK 12:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.