Zzdex
V2EX  ›  Django

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

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

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

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

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

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

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