快速在 Django 中使用 Celery 配置异步执行与定时任务

在 django 中使用 Celery

各位小伙伴注意,Celery大于3.1.25的版本不再支持Windows。Windows下推荐安装 3.1.25。

(因为我使用的 Windows,这里就以3.1.25为例。如果你还没有严重依赖Windows,请尽快投向Mac os 或 Linux 的怀抱。)

1.0 安装
# 安装 celery 和对 redis 的支持
pip install celery[redis]==3.1.25
2.0 先 看一下项目目录

Celery 的目录结构

django 项目的创建就不在说了。要确保 App 已经在 settings 的 INSTALLED_APPS 中安装。
(别问为什么说这种低级错误,我在写这个的时候新建的项目就没有安装)

3.0 开始配置Celery
3.1 在 settings 中配置 redis
# CeleryTest/settings.py

...# setting 中原有的配置

# Celery settings
BROKER_URL = 'redis://localhost:6379'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
3.2 在项目的配置文件中创建 celery.py 文件(与 settings.py 同级目录)

这个文件主要用于创建 Celery 的实例以及对 Django 的配置

celery.py 中写入

# CeleryTest/celery.py

# -*- coding:utf-8 -*-
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery

#设置 Django 的配置文件
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'CeleryTest.settings')

from django.conf import settings
# 创建 celery 实例
app = Celery('CeleryTest')

# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')

# 搜索所有 app 中的 taks
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

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

3.3 配置项目的 init.py

与settings同级的__init__.py,不是app中的__init__py)

在项目的 init.py 中写入:

# CeleryTest/__init__.py

from __future__ import absolute_import
from .celery import app as celery_app 
# 这个操作是为了确保在django启动时启动 celery 

celery的配置已经结束了,每当 Django 启动时会去扫描每一个已安装的 App 目录中的tasks.py文件。

4.0 App目录中的 tasks.py
# app1/tasks.py

# -*- coding:utf-8 -*-
from __future__ import absolute_import

from celery import shared_task
# 可以异步调用的函数
@shared_task
def add(x, y):
    return x + y

# 定时任务
# 留坑一会填
5.0 启动 worker && beat

worker:故名思意就是一个用来执行任务的进程。

beat:只有在设置了定时任务时才需要,用于分配任务,为调度控制器。
在 命令提示符 窗口中,切换到项目目录下(与 manage.py 同级)。

# 注意:worker 与 beat 需要在不同的命令提示符中执行创建
# 创建 worker
celery -A back worker -l info
# 创建 beat
celery -A back beat -l info

在开发环境中,可以这样启动来测试。在生产环境中,应该使用 Circus 来启动。实现方法将在我之后的部署相关的文章中说明。

6.0 执行

在需要调用的文件中导入 tasks.py 中的函数,然后使用 ** 函数名.delay() **调用

# 在 view.py 中
from django.http import HttpResponse

from .tasks import add
def test(request):
    # ...do somethings 
    
    add.delay()    
    # ...do somethings
    return HttpResponse("CeleryTest")
    
    

更多参考请参阅:Celery文档

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值