如何让 celery 的一个任务运行结束 5 分钟后,再次运行这个任务?

2015-03-08 17:40:04 +08:00
 9xrtp7r1

大家好
是这样的

就是我想建立一个celery任务,用来做某个事情, 需要每个5分钟运行
但是如果用一般的方法,假如这个任务有时候运行后,执行的时间大于了5分钟,那么它还没结束,celery又运行了一个任务,这样的话 就有2个一样的任务再运行了 我不想让这样的事情发生

我希望的是,无论如何 ,这个任务,同时,只能运行一次

于是我就发这个帖子来请教大家

比如任务名字叫 getName, 设置他每5分钟运行,这个任务是去爬某些数据,有时候,可能10秒就完成了, 有时候可能要10分钟

假如我 10点00分运行了getName,它本次可能要执行10分钟,那么当时间到了10点05分,celery如果开启第二个getName, 那么在10点06分的时候,就有2个getName在运行

我想的是, 能不能按照结束时间来算,比如 第一个getName是10点00分开启的,那么只要他没有结束,那么不管时间过去了多久,就都不开启新的任务; 比如时间过去了10分钟,到了10点10分,getName结束了,这时候celery开始计时。5分钟后,开始进行第二轮的celery运行

如此就可以达到互斥的效果

之前有朋友推荐我用 celery once [http://engineroom.trackmaven.com/blog/announcing-celery-once/] ,不过好像这个东西 不能实现我这样的效果哦

请问大家有什么好的方案吗

3490 次点击
所在节点    问与答
6 条回复
kier
2015-03-08 17:49:22 +08:00
为什么不用crontab执行呢?脚本做成单例的就行
yakiang
2015-03-08 17:55:06 +08:00
9xrtp7r1
2015-03-08 18:00:20 +08:00
@kier 谢谢 不过我感觉crontab 比较不太灵活,不太好迁移 因为我有个开发环境在虚拟机,正式环境在aws云上, 我每次都是开发好了,直接git 上传, 然后到aws上git 下载 ,我的项目代码都会重新自动运行最新代码, crontab 能用git同步吗,我开发环境里 修改了,正式环境 git pull后,需要手动去做什么修改吗
9xrtp7r1
2015-03-08 18:02:33 +08:00
@yakiang 谢谢 我研究下看看
lupino
2015-03-09 13:56:29 +08:00
用定时 [任务系统](https://github.com/Lupino/periodic) 好像会简单一点
9xrtp7r1
2015-03-21 02:55:14 +08:00
@lupino 3q 最后用了celery

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

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

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

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

© 2021 V2EX