Chronos有多成熟?像celery-beat这样的调度程序是否可行?
现在,我们的日程安排实现了一个定期的“心跳”任务,该任务检查“未决”事件并在事件过期时将其触发。我们使用python-dateutil的规则来定义它。
我们正在寻找这种方法的替代方法,Chronos似乎是一种非常吸引人的替代方法:1)它将减轻使用心跳计划任务的必要性,2)它支持RESTful提交ISO8601格式的事件,3)具有一个有用的接口(interface)管理,以及4)可扩展性。
至关重要的要求是,需要从Web Interface即时配置调度。这就是为什么不能立即使用celerybeat的内置计划。
我们要切换到Chronos来射击自己吗?
最佳答案
This SO为您的动态周期性任务问题提供了解决方案。目前尚未接受答案:
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()
我还没有使用djcelery,但据说它具有用于动态定期任务的管理界面。
关于celery - 用Chronos取代Celerybeat,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17098377/