1
回答
Celery4.0.2+Django1.8.12 动态添加PeriodicTask不执行
注册华为云得mate10,2.9折抢先购!>>>   

Django 1.8.12 + Celery 4.0.2

Broker:Redis

backends result:django_celery_results

beat:django_celery_beat

所用模块如上,

以前用的celery 3.1和djcelery,可以动态添加周期性任务。

现在改成4.0.2之后,发现情况:

1. 若初始化时,django DB中存有Periodic Task,则beat载入时,会写入schedule。

2.运行中,动态添加Periodic Task,则新任务没被载入。应该是beat 没有重载schedule的动作。

添加Periodic Task代码如下:

def addPerTask(request):
     nowTime = datetime.now().strftime("%H:%M:%S")
     pt = PeriodicTask()
     pt.name = 'Task' + nowTime
     pt.task = "myapp.tasks.writeLogInfo"
     schedule, created = IntervalSchedule.objects.get_or_create(
          every=3,
          period="seconds"
     )
     pt.interval = schedule
     pt.enabled = True
     pt.save()

     #PeriodicTasks.check()
     #PeriodicTasks.changed(pt)

     return HttpResponse("return something")

已设定

CELERYBEAT_SCHEDULER = 'django_celery_beat.schedulers.DatabaseScheduler'

Django也升级到1.10过,也没用.

应该是beat 没有重载schedule的动作。

求大神解答。。

举报
magicelwin
发帖于11个月前 1回/185阅

celery 4.0 和 django-celery-beat 1.0.1 不兼容,自己重写下 Scheduler,直接修改 django-celery-beat 源码,不要安装,django-celery-beat 直接引用自己重写的 Scheduler 就可以了。

当然你可以修改 celery 的源码来实现,讲道理,celery 3.0 / 4.0 + django-celery-beat 1.0.1 才是一对。

这样就能够自动重载,官方还没有修复该 bug。

https://github.com/celery/celery/pull/3791/files

顶部