celery 动态创建定时任务

  1. django 里配置celery
    创建一个celery_config文件夹
    init.py和celery.py

celery.py

# -*- coding: utf-8 -*-

from __future__ import absolute_import, unicode_literals

import os

from celery import Celery, platforms
from django.conf import settings

# http://docs.celeryproject.org/en/latest/userguide/daemonizing.html#running-the-worker-with-superuser-privileges-root
# for root start celery_config

platforms.C_FORCE_ROOT = True

# set the default Django settings module for the 'celery_config' program.
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
app = Celery("proj")

# Using a string here means the worker don't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery_config-related configuration keys
#   should have a `CELERY_` prefix.
app.config_from_object("django.conf:settings")

# Load task modules from all registered Django app configs.
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)


@app.task(bind=True)
def debug_task(self):
    print("Request: {!r}".format(self.request))

init.py

from .celery import app as celery_app

__all__ = ["celery_app"]

2.在settings.py里配置

import djcelery

INSTALLED_APPS = [
    ...,
    'djcelery'
]

BROKER_URL = "redis://127.0.0.1:6379/0"
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/1'
CELERY_ENABLE_UTC = False
CELERYBEAT_SCHEDULER = "djcelery.schedulers.DatabaseScheduler"
CELERYD_CONCURRENCY = 2

CELERY_IMPORTS = (
    'celerydemo.tasks',
)

3.创建一个tasks.py文件,里面写上要准备动态创建的定时任务

from celery import Task
from celery.schedules import crontab
from celery.task import task, periodic_task
from celery.app import shared_task


class BaseTask(Task):
    def on_failure(self, exc, task_id, args, kwargs, einfo):
        """
        任务执行失败回调
        :param exc: 
        :param task_id: 
        :param args: 
        :param kwargs: 
        :param einfo: 
        :return: 
        """
        print('执行task失败')
        print(task_id, einfo)

    def on_success(self, retval, task_id, args, kwargs):
        """
        任务执行成功回调
        :param retval: 
        :param task_id: 
        :param args: 
        :param kwargs: 
        :return: 
        """
        print(f'执行task成功,task id为:{task_id}')
        print(retval, args, kwargs)


@task(bind=True, base=BaseTask)
def add(self, a, b):
    print(self.request.id)
    print(a+b)


# @periodic_task(run_every=crontab(minute='*'), base=BaseTask)
# def print_time():
#     print('你是傻逼吗')



# 动态创建定时任务
@shared_task()
def print_kwargs(*args, **kwargs):
    print('字典参数')
    print(args)
    print(kwargs)


在views.py里创建定时任务

import json
from datetime import datetime, timedelta

from django.http import JsonResponse
from djcelery.models import PeriodicTask, PERIOD_CHOICES, IntervalSchedule, CrontabSchedule

from .tasks import add, test_task


def hello_views(request):
    PeriodicTask.objects.filter(pk=3).update(enabled=False)
    # 两种任务执行周期
    # target_time = datetime.now() + timedelta(minutes=2)
    # every = int((target_time - datetime.now()).total_seconds())
    # period = PERIOD_CHOICES[3][0]
    # interval = IntervalSchedule.objects.create(every=every, period=period)
    
    crontab = CrontabSchedule.objects.create(minute='*')
    # 创建定时任务
    PeriodicTask.objects.create(name='测试任务3',  # 名称必须唯一
                                task='celerydemo.tasks.print_kwargs',
                                # interval=interval,
                                crontab=crontab,
                                expires=datetime.now() + timedelta(hours=5),
                                args=json.dumps([1, 2]),
                                kwargs=json.dumps({'name': 'xiaoli', 'age': 20})
                                )
    return JsonResponse({'data': lst, 'code': 200})

这样定时任务创建成功
注意:要先准备任务执行方法, 否则会报错

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Celery动态添加定时任务是指在运行中动态地添加新的定时任务,而不需要重启Celery服务。具体实现方法如下: 1. 在Django中创建一个任务模块,定义需要执行的任务函数。 2. 在Django中创建一个视图函数,用于接收前端传来的定时任务参数,如任务名称、执行时间、任务参数等。 3. 在视图函数中,使用Celery提供的add_periodic_task方法,将任务添加到Celery beat中。 4. 在Celery配置文件中,设置beat_schedule参数,指定需要执行的定时任务。 举个例子,假设我们需要添加一个每天早上9点执行的任务,具体步骤如下: 1. 在Django中创建一个任务模块,定义需要执行的任务函数my_task。 2. 在Django中创建一个视图函数add_task,用于接收前端传来的任务参数。 3. 在add_task函数中,使用Celery提供的add_periodic_task方法,将任务添加到Celery beat中: ``` from celery import shared_task from celery.schedules import crontab from myapp.tasks import my_task @shared_task def add_task(task_name, task_time): crontab_time = crontab(hour=9, minute=0) # 每天早上9点执行 task = my_task.s() # my_task为需要执行的任务函数 task_name = 'my_task_' + task_name # 任务名称 app.conf.beat_schedule[task_name] = { 'task': task, 'schedule': crontab_time, } ``` 4. 在Celery配置文件中,设置beat_schedule参数,指定需要执行的定时任务: ``` app.conf.beat_schedule = { 'my_task_1': { 'task': 'myapp.tasks.my_task', 'schedule': crontab(hour=9, minute=0), }, } ``` 这样,每次调用add_task函数,就可以动态地添加新的定时任务了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值