V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
9xrtp7r1
V2EX  ›  问与答

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

  •  
  •   9xrtp7r1 · 2015-03-08 17:40:04 +08:00 · 3465 次点击
    这是一个创建于 3552 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大家好
    是这样的

    就是我想建立一个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/] ,不过好像这个东西 不能实现我这样的效果哦

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

    6 条回复    2015-03-21 02:55:14 +08:00
    kier
        1
    kier  
       2015-03-08 17:49:22 +08:00
    为什么不用crontab执行呢?脚本做成单例的就行
    9xrtp7r1
        3
    9xrtp7r1  
    OP
       2015-03-08 18:00:20 +08:00
    @kier 谢谢 不过我感觉crontab 比较不太灵活,不太好迁移 因为我有个开发环境在虚拟机,正式环境在aws云上, 我每次都是开发好了,直接git 上传, 然后到aws上git 下载 ,我的项目代码都会重新自动运行最新代码, crontab 能用git同步吗,我开发环境里 修改了,正式环境 git pull后,需要手动去做什么修改吗
    9xrtp7r1
        4
    9xrtp7r1  
    OP
       2015-03-08 18:02:33 +08:00
    @yakiang 谢谢 我研究下看看
    lupino
        5
    lupino  
       2015-03-09 13:56:29 +08:00
    用定时 [任务系统](https://github.com/Lupino/periodic) 好像会简单一点
    9xrtp7r1
        6
    9xrtp7r1  
    OP
       2015-03-21 02:55:14 +08:00
    @lupino 3q 最后用了celery
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1138 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 18:50 · PVG 02:50 · LAX 10:50 · JFK 13:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.