在Django上配置异步任务队列Celery

异步任务使用

1.安装Broker

这里我们使用redis作为broker,当然你也可以使用rabbitmq作为broker,安装完成后默认启动了,也不需要其他任何配置

yum install redis       //使用redis

或者

yum install rabbitmq-server //使用rabbitmq

2.安装Celery

pip3 install celery

3.目录结构

celery用在django项目中,django项目目录结构(简化)如下

website/
|-- deploy
|  |-- admin.py
|  |-- apps.py
|  |-- __init__.py
|  |-- models.py
|  |-- tasks.py
|  |-- tests.py
|  |-- urls.py
|  `-- views.py
|-- manage.py
|-- README
`-- website
  |-- celery.py
  |-- __init__.py
  |-- settings.py
  |-- urls.py
  `-- wsgi.py

4.创建website/celery.py主文件

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery, platforms
 
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'website.settings')
 
app = Celery('website')

app.config_from_object('django.conf:settings', namespace='CELERY')
 
app.autodiscover_tasks()
 
# 允许root 用户运行celery
platforms.C_FORCE_ROOT = True
 
@app.task(bind=True)
def debug_task(self):
  print('Request: {0!r}'.format(self.request))

5.在website/__init__.py文件中增加如下内容,确保django启动的时候这个app能够被加载到

from __future__ import absolute_import
 
from .celery import app as celery_app
 
__all__ = ['celery_app']

6.各应用创建tasks.py文件,这里为deploy/tasks.py

from __future__ import absolute_import
from celery import shared_task
 
@shared_task
def add(x, y):
  return x + y

注意tasks.py必须建在各app的根目录下,且只能叫tasks.py,不能随意命名

7.views.py中引用使用这个tasks异步处理

from deploy.tasks import add
 
def post(request):
  result = add.delay(2, 3)

8.启动celery

celery -A website worker -l info

这样在调用post这个方法时,里边的add就可以异步处理了

定时任务

定时任务的使用场景就很普遍了,比如我需要定时发送报告给老板~

1. 定时任务配置

website/celery.py文件添加如下配置以支持定时任务crontab

from celery.schedules import crontab
 
app.conf.update(
  CELERYBEAT_SCHEDULE = {
    # 每20秒执行一次add函数,并传了两个参数5和6
    'sum-task': {
      'task': 'deploy.tasks.add',
      'schedule': timedelta(seconds=20),
      'args': (5, 6)
    }
    # 每周一早上4:30执行report函数
    'send-report': {
      'task': 'deploy.tasks.report',
      'schedule': crontab(hour=4, minute=30, day_of_week=1),
    }
  }
)

timedeltadatetime中的一个对象,需要

from datetime import timedelta

引入,有如下几个参数

- days
- seconds
- microseconds
- milliseconds
- minutes
- hours

crontab的参数有:

- month_of_year
- day_of_month
- day_of_week
- hour
- minute

2. deploy/tasks.py 文件添加report方法:

@shared_task
def report():
  return 5

3.启动celery beat

celery启动了一个beat进程一直在不断的判断是否有任务需要执行

celery -A website beat -l info

Tips

1.如果你同时使用了异步任务和计划任务,有一种更简单的启动方式 celery -A website worker -b -l info ,可同时启动worker和beat

2.如果使用的不是rabbitmq做队列那么需要在主配置文件中 website/celery.py 配置broker和backend,如下:

# redis做MQ配置
app = Celery('website', backend='redis', broker='redis://localhost')
# rabbitmq做MQ配置
app = Celery('website', backend='amqp', broker='amqp://admin:admin@localhost')

3.celery不能用root用户启动的话需要在主配置文件中添加platforms.C_FORCE_ROOT = True
4.celery在长时间运行后可能出现内存泄漏,需要添加配置 CELERYD_MAX_TASKS_PER_CHILD = 10 ,表示每个worker执行了多少个任务就死掉

文章从题目加转载,原文在Django上配置异步任务队列Celery 简单几步即可完成!

你可能感兴趣的:(在Django上配置异步任务队列Celery)