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

2018-07-30 16:18:35 +08:00
 Zzdex
后台有一个订单,这个订单有一个过期时间,我需要在过期时间 来更新一下订单状态

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

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

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

https://segmentfault.com/a/1190000004634073
lihongjie0209
2018-07-30 18:13:19 +08:00
DelayQueue 可以做, 但是一旦你考虑到任务持久化的问题, 轮询数据库最简单
sampeng
2018-07-30 18:16:03 +08:00
了解一下 time wheel。。。。。其实就定时某一个时间点自然是每隔多久检查一下当前时间是什么时候。。
Zzdex
2018-07-30 18:41:09 +08:00
@brickyang #17 这个看起来不错

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/475385

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX