flask 执行定时任务问题

2020-12-21 15:27:52 +08:00
 Macv1994

之前用过 APScheduler,可以定时执行任务,但是时间都是需要先设置好,比如使用crontab的方式,这几天了解了一下 celery,发现跟 APScheduler 比较类似,也是需要先设置好时间。

现在有个场景,比如我新建了一个待办事项,时间点为 2020-12-22 11:30 分,我需要在 2020-12-22 11:20 分自动发送邮件通知我,这样的需求怎么实现呢?

我现在想到了两个方法

  1. 通过定时任务每 5 分钟查询一次数据库,如果存在需要发送邮件,则发送邮件通知;
  2. 通过 celery 异步任务,在创建待办事项的时候,将其加入到异步任务中,通过延时对应的时间,然后发送邮件;

但是感觉这两种方法非常的蠢,有没有大哥给点建议~

963 次点击
所在节点    问与答
10 条回复
awanabe
2020-12-21 15:32:57 +08:00
定时任务本质上就是周期扫描数据库
一般都是 1 方案

还有一种方案..你为你这个待办事项提醒单独创建一个 task
每次不用扫描大表, 只要扫描 task 表就可以获取代办任务
lpts007
2020-12-21 15:36:23 +08:00
1, 2 都行 2 的话需要注意长延时场景下重复执行的问题
zachlhb
2020-12-21 15:37:00 +08:00
celery 的任务可以按时间点执行的,创建不同类型的调度器就行了,clocked 调度器就是在某一个时间点执行
Macv1994
2020-12-21 15:39:00 +08:00
@awanabe 如果定时任务变多了,是不是要考虑资源消耗的问题。
Macv1994
2020-12-21 15:42:02 +08:00
@zachlhb 我看文档都是需要通过装饰器来先定义任务执行时间吗?有没有链接给我瞅一下,谢谢啦~
Macv1994
2020-12-21 15:42:32 +08:00
@lpts007 嗯嗯
maocat
2020-12-21 15:44:01 +08:00
celery 延时已经够用了,而且 celery 是支持分布式的,不怕你任务量大
awanabe
2020-12-21 15:45:53 +08:00
@Macv1994 是的..要优化 生产者消费者模型..
可以尝试下 定时任务里面调用异步任务咯
maocat
2020-12-21 15:46:29 +08:00
@Macv1994 apply_async(args, countdown=1) # countdown 时间可以控制延时时间的,你只用计算好时间差就会把任务挂到任务队列上
Macv1994
2020-12-21 15:54:46 +08:00
@awanabe 好的,感谢~

@maocat 嗯嗯,谢谢啦~

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

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

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

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

© 2021 V2EX