V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Macv1994
V2EX  ›  问与答

flask 执行定时任务问题

  •  
  •   Macv1994 · 2020-12-21 15:27:52 +08:00 · 963 次点击
    这是一个创建于 1433 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    我现在想到了两个方法

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

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

    10 条回复    2020-12-21 15:54:46 +08:00
    awanabe
        1
    awanabe  
       2020-12-21 15:32:57 +08:00
    定时任务本质上就是周期扫描数据库
    一般都是 1 方案

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

    @maocat 嗯嗯,谢谢啦~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1292 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 17:56 · PVG 01:56 · LAX 09:56 · JFK 12:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.