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

发布于 2021-01-29 15:08:34

如果我有一个定义如下的函数:

def add(x,y):
  return x+y

有没有一种方法可以动态地将此函数添加为芹菜PeriodicTask并在运行时启动它?我希望能够做类似(伪代码)的事情:

some_unique_task_id = celery.beat.schedule_task(add, run_every=crontab(minute="*/30"))
celery.beat.start(some_unique_task_id)

我还想用(pseudocode)之类的东西动态地停止或删除该任务:

celery.beat.remove_task(some_unique_task_id)

要么

celery.beat.stop(some_unique_task_id)

仅供参考,我不使用djcelery,它使您可以通过django管理员管理定期任务。

关注者
0
被浏览
103
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    不,对不起,常规的芹菜拍不可行。

    但是做您想要的事情很容易扩展,例如django-celery调度程序只是一个将调度写入数据库并将其写入数据库的子类(上面有一些优化)。

    您也可以将django-celery调度程序用于非Django项目。

    像这样:

    • 安装django + django-celery:

    $ pip install -U django django-celery

    • 将以下设置添加到您的celeryconfig中:

      DATABASES = {
      'default': {
          'NAME': 'celerybeat.db',
          'ENGINE': 'django.db.backends.sqlite3',
      },
      

      }
      INSTALLED_APPS = (‘djcelery’, )

    • 创建数据库表:

      $ PYTHONPATH=. django-admin.py syncdb --settings=celeryconfig
      
    • 使用数据库调度程序启动celerybeat:

      $ PYTHONPATH=. django-admin.py celerybeat --settings=celeryconfig \
      -S djcelery.schedulers.DatabaseScheduler
      

    还有一个djcelerymon命令可用于非Django项目,以在同一过程中启动celerycam和Django
    Admin网络服务器,您还可以使用该命令在漂亮的Web界面中编辑定期任务:

       $ djcelerymon
    

    (请注意,出于某些原因,不能使用Ctrl + C停止djcelerymon,您必须使用Ctrl + Z + kill%1)



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看