celery及异步任务的处理

1.模块组成

  • 任务模块 Task

包含异步任务和定时任务. 其中, 异步任务通常在业务逻辑中被触发并发往任务队列, ⽽定时任务由 Celery Beat 进程周期性地将任务发往任务队列.

  • 消息中间件 Broker

Broker, 即为任务调度队列, 接收任务⽣产者发来的消息(即任务),将任务存⼊队列. Celery 本身不提供队列服务, 官⽅推荐使RabbitMQ 和 Redis 等.

  • 任务执⾏单元 Worker

Worker 是执⾏任务的处理单元, 它实时监控消息队列, 获取队列中调度的任务, 并执⾏它.

  • 任务结果存储 Backend

Backend ⽤于存储任务的执⾏结果, 以供查询. 同消息中间件⼀样, 存储也可使⽤ RabbitMQ, Redis 和 MongoDB 等

2.安装

pip install celery redis

3.celery配置

# 在项目下创建一个tasks文件夹,里面新建__init__.py和config.py文件
# config.py文件内容
broker_url = 'redis://127.0.0.1:6379/0'
broker_pool_limit = 10 # Borker 连接池, 默认是10
timezone = 'Asia/Shanghai'
accept_content = ['pickle', 'json']
task_serializer = 'pickle'
result_expires = 3600 # 任务结果过期时间
result_backend = 'redis://127.0.0.1:6379/0'
result_serializer = 'pickle'
result_cache_max = 10000 # 任务结果最⼤缓存数量
worker_redirect_stdouts_level = 'INFO'
# __init__.py文件里封装celery的配置
import os
from celery import Celery
from tasks import config
os.environ.setdefault('DJANGO_SETTINGS_MODULE','chinese_greens.settings')
celery_app=Celery('async_task')
celery_app.config_from_object(config)
celery_app.autodiscover_tasks()

4.创建实例(即生产任务)

@celery_app.task
def save_avatar(uid,avatar_file):
   '''保存用户形象图片'''
   filename,filepath = save_tmp_file(avatar_file)
   u_avatar = upload_to_qn(filepath, filename)
  User.objects.filter(id=uid).update(u_avatar=u_avatar)
   os.remove(filepath)

5.调用任务

def upload_avatar(request):
   avatar_file = request.FILES.get('loadfile')
   save_avatar.delay(request.userid, avatar_file)
   return JsonResponse({'code': 0, 'data': None})

6.启动Worker(即生产任务加入任务队列)

celery worker -A tasks --loglevel=info

 

 

posted @ 2020-06-10 14:57  JustInTime  阅读(171)  评论(1)    收藏  举报