Celery
Celery是由Python开发的一个简单、灵活、可靠的处理大量任务的分发系统,它不仅支持实时处理也支持任务调度。
- user:用户程序,用于告知celery去执行一个任务。
- broker: 存放任务(依赖RabbitMQ或Redis,进行存储)
- worker:执行任务
Django中应用Celery
下载
pip3 install django-celery-beat
pip3 install redis
写入配置
CELERY_BROKER_URL = 'redis://:密码@127.0.0.1:6800'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_RESULT_BACKEND = 'redis://:密码@47.95.243.237:6800'
CELERY_TASK_SERIALIZER = 'json'
settings同级目录创建celery.py
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', '项目名.settings')
app = Celery('项目名')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
settings同级__init__.py
from .celery import app as celery_app
__all__ = ('celery_app',)
app中创建tasks.py
import uuid
from celery import shared_task
@shared_task
def to_preview_status_task(auction_id):
print("auction_id",auction_id)
view中调用
from django.shortcuts import render,HttpResponse
from . import tasks
from datetime import datetime
import time
# Create your views here.
def index(request):
# 立即执行
# result = tasks.to_preview_status_task.delay(1)
tim = '2019-10-10 20:10:10'
preview_utc_datetime =datetime.utcfromtimestamp(time.mktime(time.strptime(tim,"%Y-%m-%d %H:%M:%S")))
# 定时执行
result = tasks.to_preview_status_task.apply_async(args=[1], eta=preview_utc_datetime)
# result = tasks.to_preview_status_task.apply_async(args='传参', eta='UTC时间')
print(result.id) # 任务id
print(result.status) # 任务状态
result.revoke() # 删除任务
result.revoke(terminate=True) # 强制删除任务
return HttpResponse("200")
启动redis
启动项目
celery worker -A 项目名-l info
python manage.py runserver
可能出现的异常
ValueError: not enough values to unpack (expected 3, got 0)
解决:
# 安装eventlet
pip install eventlet
# 启动时:
celery worker -A 项目名-l info -P eventlet