Win*_*oon 14 python django celery
我尝试了我能找到的一切,包括:
celery celerybeat可以在运行时动态添加/删除任务吗?
我从上面得到的是,如果我只使用芹菜和芹菜,我必须在添加/删除任务后重新启动芹菜.但如果我结合django-celery-beat,我就不必重新启动它.
我一步一步地遵循文档:
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)
Run Code Online (Sandbox Code Playgroud)
我的celeryconfig
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"
Run Code Online (Sandbox Code Playgroud)
我的芹菜击败了跑步命令
celery -A tasks beat -l info -S django
Run Code Online (Sandbox Code Playgroud)
这很好用,任务按预期运行.之后,我编写了一个脚本来在运行时添加任务
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)
Run Code Online (Sandbox Code Playgroud)
当我查看数据库时,我得到了我的预期,新记录以及last_update字段已更新.芹菜中的日志也证明了
[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)
Run Code Online (Sandbox Code Playgroud)
我的问题是,虽然芹菜殴打知道数据库已经改变,但它仍然发送旧任务,不发送新任务给工人.任何的想法?
我使用docker作为我的项目,也许它是相关的.
【celerybeat中无法添加或删除任务】目前需要重启beat。
不可以。为了刷新 celery[beat] 内的任务或任务计时,您必须重新启动 celery[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))
Run Code Online (Sandbox Code Playgroud)
我在生产中使用它并且表现良好。
如果需要重新加载任务,只需以编程方式重新启动 celery[beat]:
@shared_task
def autoreload():
if condition:
execute_shell_code_to_restart_celery()
Run Code Online (Sandbox Code Playgroud)
我没有使用过这个,不能保证它的可用性,但理论上应该可以。
我必须重新加载beat才能在worker上更新此更改...使用django-celery-beat ...这个问题在4.0.2和master上仍然存在,测试[2016年12月21日]。
| 归档时间: |
|
| 查看次数: |
2106 次 |
| 最近记录: |