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

关于 Django 定时触发任务

  •  
  •   silhouette · 2018-06-12 13:16:30 +08:00 via Android · 6234 次点击
    这是一个创建于 2362 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在有一个这样的需求:用户调用接口 A,发起一个“新建活动”的请求,并且传来了 活动的结束时间 参数。然后后端需要在结束时间到达的时候自动触发活动结束的逻辑。请问这个需要如何解决呢?(看了一下 signal,好像没有办法按照时间触发而只能对数据库表操作触发。)

    22 条回复    2018-06-13 12:06:52 +08:00
    cloverstd
        1
    cloverstd  
       2018-06-12 13:20:48 +08:00
    celery 了解下?
    silhouette
        2
    silhouette  
    OP
       2018-06-12 13:25:25 +08:00 via Android
    @cloverstd 这个稳健。顺便问一下有没有 django 原生支持的定时触发器?
    blodside
        3
    blodside  
       2018-06-12 13:25:54 +08:00 via Android
    @silhouette 没有
    polythene
        4
    polythene  
       2018-06-12 13:28:28 +08:00
    如果不想搞太复杂的架构,可以考虑用 apscheduler,通过数据库记录定时任务:
    https://github.com/polyrabbit/WeCron/blob/master/WeCron/remind/models/scheduler.py
    xpresslink
        6
    xpresslink  
       2018-06-12 13:52:01 +08:00   ❤️ 1
    如果异步和定时任务比较多建议上 django-celery,一劳永逸。
    如果就是一个简单的任务,给你提供一个没有技术难度的方法,简单、可靠、无耦合。
    弄个数据库任务队列表,只要这么几个字段:触发时间,任务名称,触发哪个脚本,状态表示是否执行成功。

    在用户调用接口 A 时在任务表里插入一条任务,设置触发时间。

    写个脚本用 linux 的 cronjob 设置成 5 钟执行一次,从数据表里检索,触发时间已到,未执行成功的行。然后按触发脚本执行。把状态改成执行成功。
    jennifertxwoodma
        7
    jennifertxwoodma  
       2018-06-12 14:32:49 +08:00
    crontab -e 了解一下
    chengxiao
        8
    chengxiao  
       2018-06-12 14:34:54 +08:00
    省事的话 crontab + curl
    zhengxiaowai
        9
    zhengxiaowai  
       2018-06-12 14:46:00 +08:00
    推荐使用 crontab
    celery beat 无法在运行时候添加定时任务,如果添加了,必须要重启。
    linuxchild
        10
    linuxchild  
       2018-06-12 15:12:09 +08:00
    再搞个接口,跑完调用一下,哈哈哈哈
    yutian2211
        11
    yutian2211  
       2018-06-12 15:19:26 +08:00
    简单需求建议:django-crontab
    silhouette
        12
    silhouette  
    OP
       2018-06-12 15:26:12 +08:00 via Android
    @zhengxiaowai @jennifertxwoodma @chengxiao @xpresslink cron 之前就用着,现在感觉太不优雅了
    silhouette
        13
    silhouette  
    OP
       2018-06-12 15:27:52 +08:00 via Android
    @linuxchild 再调一个接口。。那你在上一个接口延时这么久更不优雅对不对
    silhouette
        14
    silhouette  
    OP
       2018-06-12 15:28:22 +08:00 via Android
    @polythene @gotounix 谢谢了老哥,回去看看
    JasperYanky
        15
    JasperYanky  
       2018-06-12 16:01:34 +08:00
    Huey 生产环境用了一年,轻量省心
    myyou
        16
    myyou  
       2018-06-12 16:21:22 +08:00
    推荐一下 dramatiq,可以做延迟任务,不过最多是一周的延迟任务
    crb912
        17
    crb912  
       2018-06-12 18:45:21 +08:00 via Android
    LinusTor
        18
    LinusTor  
       2018-06-12 19:49:50 +08:00
    可以创建自定义命令,实现你自己的逻辑 然后使用 crontab 来定时执行.
    zyqzyq08
        19
    zyqzyq08  
       2018-06-12 20:23:05 +08:00
    django-celery-beat 可以用,后台可以设置
    文档: http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html#beat-custom-schedulers
    --scheduler 参数得加
    picture2200
        20
    picture2200  
       2018-06-12 20:46:00 +08:00 via Android
    apscheduler
    Jero
        21
    Jero  
       2018-06-12 21:09:23 +08:00
    如果功能较为简单,推荐 apscheduler 定时访问 API。
    如果比较多定时、异步任务,建议用 celery
    fen
        22
    fen  
       2018-06-13 12:06:52 +08:00
    django-crontab
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   943 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 22:37 · PVG 06:37 · LAX 14:37 · JFK 17:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.