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

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

  •  
  •   Zzdex · 134 天前 · 1506 次点击
    这是一个创建于 134 天前的主题,其中的信息可能已经有所发展或是发生改变。
    后台有一个订单,这个订单有一个过期时间,我需要在过期时间 来更新一下订单状态

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

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

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

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

    然后轮询时间片
        24
    qf0129   133 天前
    @Zzdex 定义好的 task 调用 apply_async(countdown=100) 100 秒后执行
        25
    Zzdex   133 天前
    @qf0129 #24 eta 时区是个坑啊,怎么设置都不对,求指教!!
        26
    qf0129   132 天前
    eta 是个啥 这就不清楚了
        27
    fangdingjun   132 天前
    我会用最懒的办法,数据库记录过期时间,显示订单时再更新状态
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3466 人在线   最高记录 4019   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 24ms · UTC 09:35 · PVG 17:35 · LAX 01:35 · JFK 04:35
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1