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

咨询个 django 处理耗时任务的问题,顺便找个兼职完成个 demo

  •  1
     
  •   dearmymy · 2021-09-24 09:22:37 +08:00 · 2880 次点击
    这是一个创建于 1156 天前的主题,其中的信息可能已经有所发展或是发生改变。

    新手 django 。 现在情况这样,用户前端点击按钮,后台收到请求会进行一个长时间的操作( 5 分钟左右)。中间还要返回完成进度。 我看说异步操作用 celery 。但是那个 worker 貌似不能太多。比如只有四个 worker,是不是超过四个请求再进来的也得排队。 这种是不是得用线程操作。自己实现类似 celery 的样子,开启一个线程时候生成一个唯一 id,反给前端,线程根据这个 id 把中间步骤完成情况放到 redis 。前端通过这个 id 去查找完成状态。 有没有更适合的解决方法。 这个小项目是个内部演示 demo 。如果有老 django 朋友有时间,可以留下联系方式,外包出去。项目不对外只是对领导演示功能。

    16 条回复    2021-09-24 15:39:43 +08:00
    lllllliu
        1
    lllllliu  
       2021-09-24 09:34:34 +08:00
    生产者 /发布者或者 redis 的 pub/sub 也可以快速简单的实现。
    至于通知可以用 socket 主动发送,也可以按照你说的通过 job id 轮训状态。
    leopardwei
        2
    leopardwei  
       2021-09-24 09:39:48 +08:00
    celery 能满足你的需求,仔细看文档,不用再去重复造轮子了。
    wzwwzw
        3
    wzwwzw  
       2021-09-24 09:41:20 +08:00
    如果处理不完是要排队的,排队要好于你开线程,线程开太多的话,服务器承受不住的。
    chaleaoch
        4
    chaleaoch  
       2021-09-24 09:42:49 +08:00
    websocket.
    hope4tomorrow
        5
    hope4tomorrow  
       2021-09-24 09:42:54 +08:00
    绿色 cGxhaW5xaW5obA==
    hope4tomorrow
        6
    hope4tomorrow  
       2021-09-24 09:44:21 +08:00
    采用 celery 的机制没有问题,如果 5 分钟的开销减少不了,可以做成离线任务,让进度显出出来,可以感知到
    fml87
        7
    fml87  
       2021-09-24 09:50:55 +08:00
    worker 可以用协程跑啊 celery -A project -c 100 -P gevent --time-limit=600

    也支持路由、优先级之类的配置,多看看文档
    E520
        8
    E520  
       2021-09-24 10:01:26 +08:00
    websocket
    izoabr
        9
    izoabr  
       2021-09-24 10:02:31 +08:00
    上次好像想过用 celery,但是好像因为 Python 版本问题最后没用它。
    所以我是在 AppConfig 里抛几个 Thread 出来去监听 MQ 队列,这样 Thread 池的大小可以自定义,我开了 10 个。
    request 有任务需求的时候,通过发消息到 MQ 去,Thread 消费消息开始任务,做完了,按照消息里约定的 routing key 发布消息去 MQ,前端通过 mqtt 或者 websocket 消费消息。

    这样基本上就是一个 MQ Server 就够

    Python 的 MQ 客户端之前用 pika,连的 RabbitMQ 后来发现稳定性很不好,现在用 amqpstorm,稳定性还可以。
    izoabr
        10
    izoabr  
       2021-09-24 10:03:51 +08:00
    @izoabr #9 而且可以运行多个实例起来,可以有专门用来跑 Thread 的实例,用一套数据库配置就行,这样就不会多占用 web 端的资源
    coolair
        11
    coolair  
       2021-09-24 10:44:44 +08:00
    neoblackcap
        12
    neoblackcap  
       2021-09-24 11:33:02 +08:00
    WX: bmVvX2JsYWNrY2Fw
    Aprilming
        13
    Aprilming  
       2021-09-24 13:01:36 +08:00
    嘿嘿,几乎相同的业务逻辑,我的可能不是五分钟,而是 1 小时左右,用 celery+websocket, 轻松完成。
    chenqh
        14
    chenqh  
       2021-09-24 13:48:49 +08:00
    你这种大进程数开多点也没有问题吧
    chenqh
        15
    chenqh  
       2021-09-24 13:50:11 +08:00
    你这种长时间任务可能要考虑的是如果 celery 重启或者代码更新导致 celery 重启了怎么办
    dicc
        16
    dicc  
       2021-09-24 15:39:43 +08:00
    threading 都能干
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   967 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 20:17 · PVG 04:17 · LAX 12:17 · JFK 15:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.