V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
Zzdex
V2EX  ›  Django

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

  •  
  •   Zzdex · Jul 30, 2018 · 5217 views
    This topic created in 2831 days ago, the information mentioned may be changed or developed.
    后台有一个订单,这个订单有一个过期时间,我需要在过期时间 来更新一下订单状态

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

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

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

    https://segmentfault.com/a/1190000004634073
    lihongjie0209
        18
    lihongjie0209  
       Jul 30, 2018
    DelayQueue 可以做, 但是一旦你考虑到任务持久化的问题, 轮询数据库最简单
    sampeng
        19
    sampeng  
       Jul 30, 2018
    了解一下 time wheel。。。。。其实就定时某一个时间点自然是每隔多久检查一下当前时间是什么时候。。
    Zzdex
        20
    Zzdex  
    OP
       Jul 30, 2018
    @brickyang #17 这个看起来不错
    jimmyye
        21
    jimmyye  
       Jul 30, 2018   ❤️ 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  
       Jul 30, 2018   ❤️ 1
    1. celery 自带按照指定时间执行的任务功能,不过使用 redis 有坑(可以自己先踩踩)。
    2. 用 go 实现一个定时。
    3. 现成的定时框架。
    Raymon111111
        23
    Raymon111111  
       Jul 30, 2018   ❤️ 1
    用缓存+时间片

    然后轮询时间片
    qf0129
        24
    qf0129  
       Jul 31, 2018
    @Zzdex 定义好的 task 调用 apply_async(countdown=100) 100 秒后执行
    Zzdex
        25
    Zzdex  
    OP
       Jul 31, 2018
    @qf0129 #24 eta 时区是个坑啊,怎么设置都不对,求指教!!
    qf0129
        26
    qf0129  
       Jul 31, 2018
    eta 是个啥 这就不清楚了
    fangdingjun
        27
    fangdingjun  
       Aug 1, 2018
    我会用最懒的办法,数据库记录过期时间,显示订单时再更新状态
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   839 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 65ms · UTC 21:15 · PVG 05:15 · LAX 14:15 · JFK 17:15
    ♥ Do have faith in what you're doing.