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

Django 异步请求?

  •  
  •   linkbg · 38 天前 · 646 次点击
    这是一个创建于 38 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

    @111111111111 提到的分开查,这样就得等到所有查询完成才能返回页面。这样 limit 就没有用了。
        11
    jimzhong   38 天前
    @mansur

    赞同这种做法。提供两个 API,一个用于发起查询,另一个用于获取查询状态 /结果。查询操作交给任务队列完成。
        12
    JasperYanky   38 天前
    Huey 可能是最轻量级的 Celery > RQ > Huey
        13
    JasperYanky   38 天前
    另外 有些操作前端异步可能更好点,直接返回部分数据,后续数据前端到 API 里去查~
        14
    awanabe   38 天前
    celery 挺好的方案, 丢进去异步处理,搞一个长连接或者轮询去查最终结果输出的地方,比如数据库,Redis, 查到了就展现不就好了么。。
        15
    PythoneerDev6   38 天前
    @KIDJourney 赞成。 其次 Python 的 GIL 就是一个巨大坑点。没太大卵用。要 fork 来解决这个问题,简直就是增加 Python 的负担。
        16
    sagaxu   38 天前
    @PythoneerDev6 GIL 对 cpu 密集型才有影响,db 对 python 而言只是在等 io,显然 GIL 不会有任何影响
        17
    lovedboy   36 天前
    @PythoneerDev6 Fork 和 GIL 有啥关系....
    @KIDJourney 对于不是频繁执行的,我觉得 fork 总比引入 celery 要好==
    DigitalOcean
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   1178 人在线   最高记录 2607   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.7.5 · 63ms · UTC 00:14 · PVG 08:14 · LAX 17:14 · JFK 20:14
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1