关于 Django 定时触发任务

2018-06-12 13:16:30 +08:00
 silhouette

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

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

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

写个脚本用 linux 的 cronjob 设置成 5 钟执行一次,从数据表里检索,触发时间已到,未执行成功的行。然后按触发脚本执行。把状态改成执行成功。
jennifertxwoodma
2018-06-12 14:32:49 +08:00
crontab -e 了解一下
chengxiao
2018-06-12 14:34:54 +08:00
省事的话 crontab + curl
zhengxiaowai
2018-06-12 14:46:00 +08:00
推荐使用 crontab
celery beat 无法在运行时候添加定时任务,如果添加了,必须要重启。
linuxchild
2018-06-12 15:12:09 +08:00
再搞个接口,跑完调用一下,哈哈哈哈
yutian2211
2018-06-12 15:19:26 +08:00
简单需求建议:django-crontab
silhouette
2018-06-12 15:26:12 +08:00
@zhengxiaowai @jennifertxwoodma @chengxiao @xpresslink cron 之前就用着,现在感觉太不优雅了
silhouette
2018-06-12 15:27:52 +08:00
@linuxchild 再调一个接口。。那你在上一个接口延时这么久更不优雅对不对
silhouette
2018-06-12 15:28:22 +08:00
@polythene @gotounix 谢谢了老哥,回去看看
JasperYanky
2018-06-12 16:01:34 +08:00
Huey 生产环境用了一年,轻量省心
myyou
2018-06-12 16:21:22 +08:00
推荐一下 dramatiq,可以做延迟任务,不过最多是一周的延迟任务
crb912
2018-06-12 18:45:21 +08:00
LinusTor
2018-06-12 19:49:50 +08:00
可以创建自定义命令,实现你自己的逻辑 然后使用 crontab 来定时执行.
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
2018-06-12 20:46:00 +08:00
apscheduler

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/462433

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX