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

请教一下:具体到某个时间点的任务怎么实现?

  •  
  •   Zzdex · 2018-07-30 16:18:35 +08:00 · 4036 次点击
    这是一个创建于 2068 天前的主题,其中的信息可能已经有所发展或是发生改变。
    后台有一个订单,这个订单有一个过期时间,我需要在过期时间 来更新一下订单状态

    自己用 celery 的周期任务 每分钟轮询来实现 但这样轮询感觉不是很友好。

    有没有这种能设置固定时间的任务?
    27 条回复    2018-08-01 09:43:16 +08:00
    zdnuist
        1
    zdnuist  
       2018-07-30 16:40:44 +08:00
    Quartz
    b821025551b
        2
    b821025551b  
       2018-07-30 16:42:29 +08:00
    这种用 Redis 来实现很方便。
    qf0129
        3
    qf0129  
       2018-07-30 16:49:42 +08:00 via iPhone
    Celery 有 async_task 可以指定时间或者延迟执行
    Zzdex
        4
    Zzdex  
    OP
       2018-07-30 17:08:07 +08:00
    @qf0129 #3 可以介绍下怎么操作吗?
    Rekkles
        5
    Rekkles  
       2018-07-30 17:14:40 +08:00
    crontab
    Zzdex
        6
    Zzdex  
    OP
       2018-07-30 17:17:52 +08:00
    @Rekkles #5 crontab 只能是周期任务,我想要具体到某个时间点执行,然后只执行一次
    tomczhen
        7
    tomczhen  
       2018-07-30 17:19:18 +08:00 via Android
    业余允许的话,在建立订单的时候设定好 expire at 时间,同时返回 expire in n sec 给前端,发生查询或业务时判断 expire at 时间来做是否过期判断。
    Zzdex
        8
    Zzdex  
    OP
       2018-07-30 17:22:19 +08:00
    @tomczhen #7 expire 在订单生成时 确实订好了,但是过期的订单,在过期之后需要一些操作必须在后端完成,,比如说发通知给用户
    misaka19000
        9
    misaka19000  
       2018-07-30 17:33:58 +08:00
    为啥不友好?我觉得就挺好的 单独写个项目来处理这些定时任务不就行了
    zpfhbyx
        10
    zpfhbyx  
       2018-07-30 17:39:59 +08:00
    写 daemon 啊,时间肯定比一分钟短。。
    victrec
        11
    victrec  
       2018-07-30 17:46:04 +08:00
    thinkwei2012
        12
    thinkwei2012  
       2018-07-30 17:46:27 +08:00
    同意 Redis
    hahasong
        13
    hahasong  
       2018-07-30 17:47:06 +08:00
    写个 go 服务长驻进程,周期性检查处理
    Zzdex
        14
    Zzdex  
    OP
       2018-07-30 17:57:52 +08:00
    @b821025551b #2
    @thinkwei2012 #12

    不知道你们所说的单纯的用 redis 实现 是怎么个实现法?队列?
    Zzdex
        15
    Zzdex  
    OP
       2018-07-30 17:59:03 +08:00
    @victrec #11 这和 crontab 有什么区别吗
    lshero
        16
    lshero  
       2018-07-30 18:04:31 +08:00
    延时队列
    brickyang
        17
    brickyang  
       2018-07-30 18:07:46 +08:00 via iPhone   ❤️ 1
    Redis 可以设置键的过期时间,2.8 版本以上支持键空间消息,键过期时会发布一个通知,订阅该通知即可

    https://segmentfault.com/a/1190000004634073
    lihongjie0209
        18
    lihongjie0209  
       2018-07-30 18:13:19 +08:00
    DelayQueue 可以做, 但是一旦你考虑到任务持久化的问题, 轮询数据库最简单
    sampeng
        19
    sampeng  
       2018-07-30 18:16:03 +08:00
    了解一下 time wheel。。。。。其实就定时某一个时间点自然是每隔多久检查一下当前时间是什么时候。。
    Zzdex
        20
    Zzdex  
    OP
       2018-07-30 18:41:09 +08:00
    @brickyang #17 这个看起来不错
    jimmyye
        21
    jimmyye  
       2018-07-30 19:02:03 +08:00   ❤️ 1
    http://docs.celeryproject.org/en/latest/userguide/calling.html#eta-and-countdown
    >The ETA (estimated time of arrival) lets you set a specific date and time that is the earliest time at which your task will be executed. countdown is a shortcut to set ETA by seconds into the future.
    wq7
        22
    wq7  
       2018-07-30 19:09:52 +08:00   ❤️ 1
    1. celery 自带按照指定时间执行的任务功能,不过使用 redis 有坑(可以自己先踩踩)。
    2. 用 go 实现一个定时。
    3. 现成的定时框架。
    Raymon111111
        23
    Raymon111111  
       2018-07-30 19:17:41 +08:00   ❤️ 1
    用缓存+时间片

    然后轮询时间片
    qf0129
        24
    qf0129  
       2018-07-31 15:32:59 +08:00
    @Zzdex 定义好的 task 调用 apply_async(countdown=100) 100 秒后执行
    Zzdex
        25
    Zzdex  
    OP
       2018-07-31 17:07:24 +08:00
    @qf0129 #24 eta 时区是个坑啊,怎么设置都不对,求指教!!
    qf0129
        26
    qf0129  
       2018-07-31 17:50:32 +08:00
    eta 是个啥 这就不清楚了
    fangdingjun
        27
    fangdingjun  
       2018-08-01 09:43:16 +08:00
    我会用最懒的办法,数据库记录过期时间,显示订单时再更新状态
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1195 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 18:13 · PVG 02:13 · LAX 11:13 · JFK 14:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.