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

django 定时触发任务

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

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

    产品需求

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

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

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

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

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

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

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

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

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