首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Chronos代替Celerybeat

用Chronos代替Celerybeat
EN

Stack Overflow用户
提问于 2013-06-13 22:38:10
回答 1查看 2.1K关注 0票数 10

史考斯有多成熟?它是像芹菜节拍这样的调度器的可行替代方案吗?

现在,我们的调度实现了一个周期性的“心跳”任务,该任务检查“未完成的”事件,并在它们过期时触发它们。我们使用python-dateutil的规则来定义这一点。

我们正在研究这种方法的替代方案,史考斯似乎是一个非常吸引人的选择: 1)它将减少使用心跳调度任务的必要性,2)它支持RESTful提交具有ISO8601格式的事件,3)有一个有用的管理接口,4)它的扩展。

关键的要求是调度需要从Web接口动态地进行配置。这就是为什么不能使用赛利贝特的内置计划。

我们会把自己的脚打到Chronos去吗?

EN

回答 1

Stack Overflow用户

发布于 2014-11-10 10:21:54

这是如此为您的动态周期任务问题提供了解决方案。这不是目前公认的答案:

代码语言:javascript
复制
 from djcelery.models import PeriodicTask, IntervalSchedule
 from datetime import datetime

 class TaskScheduler(models.Model):

     periodic_task = models.ForeignKey(PeriodicTask)

     @staticmethod
     def schedule_every(task_name, period, every, args=None, kwargs=None):
     """ schedules a task by name every "every" "period". So an example call would be:
          TaskScheduler('mycustomtask', 'seconds', 30, [1,2,3]) 
          that would schedule your custom task to run every 30 seconds with the arguments 1 ,2 and 3 passed to the actual task. 
     """
         permissible_periods = ['days', 'hours', 'minutes', 'seconds']
         if period not in permissible_periods:
             raise Exception('Invalid period specified')
         # create the periodic task and the interval
         ptask_name = "%s_%s" % (task_name, datetime.datetime.now()) # create some name for the period task
         interval_schedules = IntervalSchedule.objects.filter(period=period, every=every)
         if interval_schedules: # just check if interval schedules exist like that already and reuse em
             interval_schedule = interval_schedules[0]
         else: # create a brand new interval schedule
             interval_schedule = IntervalSchedule()
             interval_schedule.every = every # should check to make sure this is a positive int
             interval_schedule.period = period 
             interval_schedule.save()
         ptask = PeriodicTask(name=ptask_name, task=task_name, interval=interval_schedule)
         if args:
             ptask.args = args
         if kwargs:
             ptask.kwargs = kwargs
         ptask.save()
         return TaskScheduler.objects.create(periodic_task=ptask)

     def stop(self):
         """pauses the task"""
         ptask = self.periodic_task
         ptask.enabled = False
         ptask.save()

     def start(self):
         """starts the task"""
         ptask = self.periodic_task
         ptask.enabled = True
         ptask.save()

     def terminate(self):
         self.stop()
         ptask = self.periodic_task
         self.delete()
         ptask.delete()

我还没有使用芹菜,但据说它有一个动态周期性任务的管理界面。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17098377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档