celery 停止任务_如何向Celery动态添加/删除定期任务(celerybeat)

这个问题在google网上论坛上得到了回答。

我不是作者,所有功劳归Jean Jean

这是一个适当的解决方案。确认可以正常工作,在我的场景中,我将“定期任务”子类化,并根据它创建了一个模型,因为我可以根据需要向模型中添加其他字段,也可以添加“终止”方法。您必须将定期任务的enabled属性设置为False并保存,然后再将其删除。整个子类不是必须的,schedule_every方法是真正起作用的方法。当您准备终止任务时(如果您没有将其子类化),您可以使用PeriodicTask.objects.filter(name = ...)搜索任务,将其禁用,然后将其删除。

希望这可以帮助!

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值