如何使用 celery 和 Django 以编程方式生成 celerybeat 条目

2024-05-12

我希望能够以编程方式生成 celerybeat 条目并在添加条目时重新同步 celerybeat。文档here http://ask.github.com/celery/userguide/periodic-tasks.html state

默认情况下,条目取自 CELERYBEAT_SCHEDULE 设置,但也可以使用自定义存储,例如将条目存储在 SQL 数据库中。

所以我试图弄清楚我需要扩展哪些类才能做到这一点。

我一直在看芹菜调度程序文档 http://ask.github.com/celery/internals/reference/celery.beat.html and djcelery API 文档 http://ask.github.com/django-celery/reference/djcelery.schedulers.html但是关于其中一些方法的作用的文档是不存在的,所以要深入研究一些来源,只是希望有人能给我指出正确的方向。

我想我正在做的事情的高水平会有所帮助...作为用户,我需要能够从一组预定义的任务中进行选择,并为用户提供一种选择某种自定义计划的方法执行,例如每天/每周/每月以及哪一天和时间。

这也是在 Django 中使用 djcelery 实现的。

UPDATE

我看到 djcelery 管理员的代码,但不清楚如何保留该数据。我目前有一个通用的addTask视图看起来像这样:

def addTask(request):

intervalSchedule = IntervalSchedule.from_schedule(schedule(timedelta(seconds=10)))
intervalSchedule.save()
modelData = dict(
    name="dcTestPersist",
    task="technologytrackerapi.views.createRecord",
    schedule=intervalSchedule,
)
periodicTask = PeriodicTask(**modelData)
periodicTask.save()
return render_to_response('taskView.html')

数据在数据库中看起来正确,但当守护程序运行时出现以下错误:

[2012-03-06 00:23:07,926:警告/节拍] 进程节拍:
[2012-03-06 00:23:07,926:警告/节拍]回溯(最近一次调用):
[2012-03-06 00:23:07,926:警告/节拍]文件“/usr/lib/python2.7/multiprocessing/process.py”,第258行,在_bootstrap中
[2012-03-06 00:23:07,926:警告/节拍] self.run()
[2012-03-06 00:23:07,927:警告/Beat]文件“/home/dchesterman/Documents/PythonDev/.virtualenvs/ros/local/lib/python2.7/site-packages/celery/beat.py” ,第 464 行,运行中
[2012-03-06 00:23:07,927:警告/节拍] self.service.start(embedded_process=True)
[2012-03-06 00:23:07,927:警告/Beat]文件“/home/dchesterman/Documents/PythonDev /.virtualenvs/ros/local/lib/python2.7/site-packages/celery/beat.py” ,第 403 行,在开始处
[2012-03-06 00:23:07,927:警告/节拍]间隔= self.scheduler.tick()
[2012-03-06 00:23:07,927:警告/Beat]文件“/home/dchesterman/Documents/PythonDev/.virtualenvs/ros/local/lib/python2.7/site-packages/celery/beat.py” ,第 194 行,勾选
[2012-03-06 00:23:07,927:警告/节拍] next_time_to_run = self.maybe_due(entry, self.publisher)
[2012-03-06 00:23:07,927:警告/Beat]文件“/home/dchesterman/Documents/PythonDev/.virtualenvs/ros/local/lib/python2.7/site-packages/celery/beat.py” ,第 170 行,在 Maybe_due 中
[2012-03-06 00:23:07,927:警告/节拍] is_due,next_time_to_run = entry.is_due()
[2012-03-06 00:23:07,928:警告/节拍]文件“/home/dchesterman/Documents/PythonDev/.virtualenvs/ros/local/lib/python2.7/site-packages/djcelery/schedulers.py” ,第 54 行,在 is_due 中
[2012-03-06 00:23:07,928:警告/节拍]返回 self.schedule.is_due(self.last_run_at)
[2012-03-06 00:23:07,928:警告/节拍] AttributeError:“NoneType”对象没有属性“is_due”

我不确定为什么我的时间表不使用默认值is_due()


这就是最终为我工作的结果:

def addTask(request):

  intervalSchedule = IntervalSchedule.from_schedule(schedule(timedelta(seconds=10)))
  intervalSchedule.save()

  modelData = dict(
      name="dcTestPersist",
      task="technologytrackerapi.tasks.createRecord",
      interval_id=intervalSchedule.pk,
  )

  periodicTask = PeriodicTask(**modelData)
  periodicTask.save()

  me = ModelEntry(periodicTask)

  try:
      me.save()

  except:
    from django.db import connection
    print connection.queries
    raise

  return render_to_response('taskView.html')

我必须将定期任务包装在 ModelEntry 中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 celery 和 Django 以编程方式生成 celerybeat 条目 的相关文章

随机推荐