请教一下:具体到某个时间点的任务怎么实现? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Zzdex
V2EX    Django

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

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

    自己用 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 Andrid
    业余允许的话,在建立订单的时候设定好 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
    为啥不友好?我觉得就挺好的 单独写个项目来处理这些定时任务不就行了
    justseemore
        10
    justseemore  
       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     Solana     3252 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 11:55 PVG 19:55 LAX 04:55 JFK 07:55
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86