Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python celery、celerybeat和django celery beat是否可以在运行时动态添加/删除任务,而无需重新启动celerybeat?_Python_Django_Celery - Fatal编程技术网

Python celery、celerybeat和django celery beat是否可以在运行时动态添加/删除任务,而无需重新启动celerybeat?

Python celery、celerybeat和django celery beat是否可以在运行时动态添加/删除任务,而无需重新启动celerybeat?,python,django,celery,Python,Django,Celery,我尝试了我能找到的一切,包括: 栈溢出 Github问题 我从上面得到的是,如果我只使用芹菜和芹菜节拍,我必须在添加/删除任务后重新启动芹菜节拍。但我不必重新启动它,如果我结合了django芹菜节拍 我会循序渐进: from celery import Celery from celery.schedules import crontab app = Celery('tasks') app.config_from_object('celeryconfig') app.conf.timez

我尝试了我能找到的一切,包括:

栈溢出

Github问题

我从上面得到的是,如果我只使用芹菜和芹菜节拍,我必须在添加/删除任务后重新启动芹菜节拍。但我不必重新启动它,如果我结合了django芹菜节拍

我会循序渐进:

from celery import Celery
from celery.schedules import crontab

app = Celery('tasks')
app.config_from_object('celeryconfig')
app.conf.timezone = 'UTC'

@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
    # Calls test('hello') every 10 seconds.
    sender.add_periodic_task(10.0, test.s('hello'), name='add every 10')

    # Calls test('world') every 30 seconds
    sender.add_periodic_task(30.0, test.s('world'), expires=10)

    # Executes every Monday morning at 7:30 a.m.
    sender.add_periodic_task(
        crontab(hour=7, minute=30, day_of_week=1),
        test.s('Happy Mondays!'),
    )

@app.task
def test(arg):
    print(arg)
我的芹菜

BROKER_URL = 'amqp://rabbit'
CELERY_RESULT_BACKEND = 'rpc://rabbit'
CELERY_RESULT_PERSISTENT = True
# CELERY_ACKS_LATE = True
CELERY_DEFAULT_DELIVERY_MODE = 2
CELERY_TASK_RESULT_EXPIRES = 3600
CELERYBEAT_SCHEDULER ="django_celery_beat.schedulers:DatabaseScheduler"
我的芹菜跑得快

celery -A tasks beat -l info -S django
这很好,任务按预期运行

import django
django.setup()
from tasks import app, setup_periodic_tasks
from django_celery_beat.models import PeriodicTask, CrontabSchedule


crontab = CrontabSchedule.objects.create(
       minute='*/1',
       hour='*',
       day_of_week='*',
   )

period = PeriodicTask.objects.create(
       name='testfasd',
       kwargs={},
       crontab=crontab,
       task='tasks.test',
   )

setup_periodic_tasks(app)
当我查看数据库时,我得到了我所期望的,新记录以及上次更新的字段已经更新。芹菜中的日志也证明了这一点

[2016-12-20 17:37:21,796: INFO/MainProcess] Writing entries...
[2016-12-20 17:37:21,840: INFO/MainProcess] Scheduler: Sending due task add every 10 (tasks.test)
[2016-12-20 17:37:31,848: INFO/MainProcess] DatabaseScheduler: Schedule changed.
[2016-12-20 17:37:31,851: INFO/MainProcess] Writing entries...
[2016-12-20 17:37:31,930: INFO/MainProcess] Scheduler: Sending due task add every 10 (tasks.test)
我的问题是,虽然芹菜拍知道数据库已更改,但它仍然发送旧任务,而不将新任务发送给工作人员。有什么想法吗

更新 我正在使用docker进行我的项目,可能是相关的。

[您无法在celerybeat中添加或删除任务]当前,您必须重新启动beat

否。要刷新芹菜[beat]中的任务或任务计时,必须重新启动芹菜[beat]实例。任务在运行时加载到内存中。要更改/添加任务,必须刷新实例

您可以考虑使用自定义循环和条件执行使用自循环任务。例如:

from datetime import timedelta
from celery import shared_task

@shared_task
def check_conditions():
    # Do some db-level code
    if condition:
        check_conditions.apply_async(eta=timedelta(hours=6))
我在生产中使用它,它的性能很好

如果需要重新加载任务,只需通过编程重新启动芹菜[beat]:

@shared_task
def autoreload():
    if condition:
        execute_shell_code_to_restart_celery()
我没有用过这个,也不能保证它的可用性,但理论上应该是可行的

我必须重新加载beat才能在worker上更新此更改 ... 用django芹菜打。。。 该问题在4.0.2和master上仍然存在,并在2016年12月21日进行了测试


我也试着做同样的事情,却遇到了同样的问题。事实上,你和我并不孤单。在这里你们可以看到更多关于相关问题的评论,我只是不认为这个库按照你们想要的方式工作。这类事情的问题通常是“生命周期”,这意味着应用程序启动,使用配置,然后进入就绪状态。就绪状态简单且一致,因为它是不可变的。如果你去添加和删除一些东西,这会使工程变得困难(锁、信号量、这段代码是可重入的吗?这些哲学家吃什么?等等)。谢谢nsfyn,所以我唯一能做的就是每次我更改任务时重新启动它。我不能肯定地说,但看起来是这样的。我在文档中没有看到任何东西表明,如果不对芹菜的应用程序生命周期进行大量修改,您所需的路径是可能的。