celery定时任务

celery定时任务.jpg
注意:不论是定时任务,还是普非定时任务,都需要启动worker,别忘记。(〃>目<)

老方法

# 1 配置文件 celery.py中 不是settings.py中!!!

# 时区
app.conf.timezone = 'Asia/Shanghai'
# 是否使用UTC
app.conf.enable_utc = False

# 任务的定时配置
from datetime import timedelta
from celery.schedules import crontab
app.conf.beat_schedule = {
    # add-task  这个名称可以随便写
    'add-task': {
        # 导入到具体的函数  注意 是导入到具体的任务函数!
        'task': 'celery_task.user_task.add',
        'schedule': timedelta(seconds=3),
        # 'schedule': crontab(hour=8, day_of_week=1),  # 每周一早八点
        'args': (300, 150),
    },
    'send-sms-task': {
        'task': 'celery_task.order_task.send_sms',
        # 'schedule': timedelta(seconds=30),
        'schedule': crontab(hour=11,minute=20),  # 每天11点20执行
        'args': ('189232222',888),
    },
}

# 2 启动beat  定时任务是用beat
    celery -A celery_task beat -l debug
# 3 启动worker
	celery -A celery_task worker -l debug -P eventlet  # 别忘记这一步!!!

新方法

settings.py

# settings.py
# celery配置
CELERY_BROKER_URL = 'redis://localhost:6379/1'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/2'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = 'UTC'



# celery官方方案的定时任务
from datetime import timedelta
CELERY_BEAT_SCHEDULE = {
    'update-banner': {
        # 'task': 'luffy_api.apps.home.tasks.update_banner',
        'task': 'home.tasks.update_banner',
        'schedule': timedelta(seconds=10), # 间隔时间
        'args': (), # 需要传递的参数
    },
    # 其他定时任务...
}

celery.py

from celery import Celery
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "luffy_api.settings.dev")
import django
django.setup()
from django.conf import settings


app = Celery("luffy_api")
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()

tasks.py

from django.core.cache import cache

@shared_task
def update_banner():
    banner_instance = Banner.objects.filter(is_delete=False, is_show=True).order_by('orders')[0:settings.BANNER_COUNT]
    serializer = BannerSerizlizer(instance=banner_instance, many=True)
    # serializer.data 返回的是经过序列化的数据。
    for item in serializer.data:
        item['image']=settings.BASE_URL+ item['image']
    cache.set("banner_list", serializer.data)
    return '轮播图缓存更新成功'
posted @ 2024-05-29 18:20  小满三岁啦  阅读(46)  评论(0编辑  收藏  举报