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

django 定时触发任务

  •  
  •   lyang · 2022-05-11 09:52:43 +08:00 · 3657 次点击
    这是一个创建于 918 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一个小的店铺项目,需要实现自动下架的功能,比如,页面上设置了下架时间为 2022 年 6 月 1 日 10:00:00,然后在指定时间下架。

    产品需求

    • 不要定期触发的定时任务,比如 1 分钟一次查数据库,不够精准,耗资源
    • 用指定时间任务的形式触发修改上下架状态,(用下架时间判断上下架的方式,这样就不用定时任务触发,pass )

    所以想问问,django 有没有接口触发,创建任务,在指定的日期时间运行一次的模块。

    25 条回复    2022-06-27 09:55:34 +08:00
    wizardoz
        1
    wizardoz  
       2022-05-11 09:58:10 +08:00
    apscheduler
    justyoung
        2
    justyoung  
       2022-05-11 10:02:43 +08:00
    试试 Celery
    lyang
        3
    lyang  
    OP
       2022-05-11 10:05:10 +08:00
    @wizardoz
    ```
    sched.add_job(my_job, 'date', run_date=datetime(2009, 11, 6, 16, 30, 5), args=['text'])
    ```
    看到了,我再看看能不能跟接口结合
    qsnow6
        4
    qsnow6  
       2022-05-11 10:06:02 +08:00
    lyang
        5
    lyang  
    OP
       2022-05-11 10:06:17 +08:00
    @justyoung
    我先看看 apscheduler ,之前的自动确认收货就是用这个,apscheduler 可以指定 run_date ,或许可以实现需求
    lyang
        6
    lyang  
    OP
       2022-05-11 10:09:25 +08:00
    @qsnow6
    暂时没看到有指定时间的
    sujin190
        7
    sujin190  
       2022-05-11 10:13:37 +08:00
    https://github.com/snower/forsun

    推荐下之前做的服务,能够用商品 ID 做 key 创建定时任务,可以设置为到时间自动回调你设定的 url ,后端持久化可以用 redis ,估计能满足你的需求吧
    lyang
        8
    lyang  
    OP
       2022-05-11 10:17:28 +08:00
    @sujin190 多谢,star 了,需求能满足,我这个小项目,apscheduler 能满足我还是先用 apscheduler 了
    westoy
        9
    westoy  
       2022-05-11 10:17:49 +08:00   ❤️ 1
    商品直接加有效期起始字段, 展示和用户下单的时候判断是否在有效期

    要干一些关联性收尾的活儿用任务队列那是没办法, 就判断下是否在有效期没必要啊......
    fds
        10
    fds  
       2022-05-11 10:21:31 +08:00
    仅就这个需求来说,直接用下架时间判断还是最理想。用定时任务你得能接受分钟级别误差,而且还得记录执行状态避免各种没能执行的情况,没必要。
    sciel
        11
    sciel  
       2022-05-11 10:24:38 +08:00
    lyang
        12
    lyang  
    OP
       2022-05-11 10:26:28 +08:00
    @westoy
    @fds
    我也是这样想的,产品需求 pass 了
    lyang
        13
    lyang  
    OP
       2022-05-11 10:27:13 +08:00
    @sciel go 不会啊,python 也有,只是我之前没找到,没碰到这类需求。/苦笑
    a663
        14
    a663  
       2022-05-11 11:01:51 +08:00
    查一下 django-q 或者 celery 你这个场景直接 django-q 就 ok
    krixaar
        15
    krixaar  
       2022-05-11 11:05:30 +08:00
    直接写 view 里处理就是了,当后台 query 商品列表的时候还有前台访问商品的时候,如果当前时间大于下架时间而且上架状态不正确的直接改掉 save ,也就是没人看的时候不改数据库,有人看了才改一次,这样也不用担心定时任务万一没跑搞出状态 bug
    isSamle
        16
    isSamle  
       2022-05-11 11:09:59 +08:00
    http://106.13.1.2/project-1/doc-210/
    或者用 sh 脚本定时触发
    kidblg
        17
    kidblg  
       2022-05-11 11:16:19 +08:00
    为啥不在商品 model 里加入下架时间呢?
    lyy16384
        18
    lyy16384  
       2022-05-11 11:17:09 +08:00
    @lyang #12 你们的产品这么强势的吗,连开发方案也要他定
    lyang
        19
    lyang  
    OP
       2022-05-11 11:24:51 +08:00
    @a663 先用 apscheduler 这个了

    @krixaar 这也是一种方法,但是多个接口里有用到,如果 model 支持在被查询的时候触发信号,应该可以

    @isSamle 我这需要指定 datetime ,不是定期,所以一开始没找到。

    @kidblg 加了,但是不让用这个方法。。。

    @lyy16384 额,几年的工作让我习惯了,我说了几遍,不让用,那就算了,到这找找解决方案,还好有现成的
    paopjian
        20
    paopjian  
       2022-05-11 12:33:12 +08:00
    数据库里加一条过期时间,一旦有人浏览这个物品了就触发检测显示下架?这样也不用定时了
    Huelse
        21
    Huelse  
       2022-05-11 13:14:34 +08:00
    crontab 就可以了
    Rache1
        22
    Rache1  
       2022-05-11 13:39:01 +08:00
    延时队列
    Aprilming
        23
    Aprilming  
       2022-05-11 16:28:47 +08:00
    celery 延时就行了
    himeson
        24
    himeson  
       2022-06-25 23:35:21 +08:00
    celery 是正解,在添加商品下架日期后,用 celery 设置一个 schedule 是每分钟执行一次的任务,搜索当前时间有没有需要下架操作的商品,有就执行下架。
    lyang
        25
    lyang  
    OP
       2022-06-27 09:55:34 +08:00
    @himeson 我还是用了 apscheduler ,轻量。另外这些库都有指定时间的,可以不用每分钟执行一次,可以在指定日期时分秒执行。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1677 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 16:56 · PVG 00:56 · LAX 08:56 · JFK 11:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.