Django Celery 异步任务配置与后台守护进程运行指南
本文详细讲解如何在 Django 项目中集成 Celery 实现异步任务处理,并通过 Redis 作为消息中间件。文章涵盖 Celery 核心配置、异步函数定义与调用,重点介绍了在 Linux 环境下将 Celery Worker 设为后台守护进程运行的两种方法:使用 nohup 结合脚本,以及利用 screen 工具管理会话。
环境准备与依赖安装
本方案基于 Python 3.6 与 Django 2.0.5 环境。为了简化依赖管理,推荐使用包含 Redis 支持的 Celery 集成包进行安装:
pip install celery-with-redisCelery 核心配置
在 Django 项目中集成 Celery,需要在项目配置目录(如 myproject)中完成以下关键步骤:
1. 定义 Celery 实例
在项目根目录下创建 celery.py 文件。该文件负责初始化 Celery 应用实例,并读取 Django 的配置信息。注意文件首行必须包含 from __future__ import absolute_import, unicode_literals 以避免导入冲突。
from __future__ import absolute_import, unicode_literals
from celery import Celery
from django.conf import settings
import os
# 获取当前文件夹名,即为该Django的项目名
project_name = os.path.split(os.path.abspath('.'))[-1]
project_settings = '%s.settings' % project_name
# 设置环境变量
os.environ.setdefault('DJANGO_SETTINGS_MODULE', project_settings)
# 实例化Celery
app = Celery(project_name)
# 使用django的settings文件配置celery
app.config_from_object('django.conf:settings')
# Celery加载所有注册的应用
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)2. 配置 Django Settings
在 settings.py 中添加 Celery 相关参数,指定 Redis 作为消息代理(Broker)和结果后端(Backend):
# celery settings
# celery中间人 redis://redis服务所在的ip地址:端口/数据库号
BROKER_URL = 'redis://localhost:6379/3'
# celery结果返回,可用于跟踪结果
CELERY_RESULT_BACKEND = 'redis://localhost:6379/3'
# celery内容等消息的格式设置
CELERY_ACCEPT_CONTENT = ['application/json', ]
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
# celery时区设置,使用settings中TIME_ZONE同样的时区
CELERY_TIMEZONE = TIME_ZONE3. 确保 Django 加载 Celery
在项目根目录的 __init__.py 中导入 Celery 实例,确保 Django 启动时自动加载 Celery 配置:
from __future__ import absolute_import, unicode_literals
# 引入celery实例对象
from .celery import app as celery_app异步任务定义与调用
1. 定义异步任务
在项目根目录创建 celery_tasks 模块,并在其下建立 tasks.py 文件。使用 @celery_app.task 装饰器将普通函数标记为异步任务:
from myproject import celery_app
import time
@celery_app.task
def time_consuming_fun():
for i in range(5):
time.sleep(1)
print(i)
return 'ok'2. 在视图中调用
在 Django 的 View 中,通过调用任务的 .delay() 方法触发异步执行。直接调用函数名则会同步执行:
from celery_tasks.tasks import time_consuming_fun
from django.views import View
from django.http import JsonResponse
class MyView(View):
def get(self,request):
#异步调用
time_consuming_fun.delay()
#直接调用
#time_consuming_fun()
return JsonResponse({'msg':'ok','code':200})Celery Worker 后台运行方案
默认情况下,直接在终端运行 celery -A myproject worker -l info 会导致终端关闭后进程终止。为实现后台守护进程运行,可采用以下两种方案:
方案一:使用 nohup 与脚本
利用 nohup 命令使进程忽略挂起信号,配合 & 符号在后台运行。标准输出将自动重定向至 nohup.out。建议编写启动脚本(如 start.sh)并正常退出账户以保证运行:
# 启动Django服务示例
nohup python manage.py runserver 0.0.0.0:5008 &
# 启动Celery Worker示例
nohup /root/start.sh &执行后终端会提示:[~]$ appending output to nohup.out。
方案二:使用 Screen 工具
Screen 提供了更灵活的会话管理功能。首先安装 Screen:
yum install -y screen创建名为 xiedi 的会话窗口:
screen -S xiedi在 Screen 窗口内启动 Django 服务:
python manage.py runserver 0.0.0.0:9000按 Ctrl+A+D 分离会话。重新登录终端后,可通过以下命令查看并重新连接会话:
# 列出所有Screen进程
[root@docker ~]# screen -ls
There are screens on:
3029.xiedi (Attached)
# 重新连接到会话ID为3029的窗口
screen -r 3029对于 Celery Worker,同样可以使用 celery multi 命令指定日志文件(--logfile)和进程ID文件(--pidfile)进行后台管理:
celery multi start w1 -A myproject -l info --logfile = celerylog.log --pidfile = celerypid.pid通过记录 Worker 名称(如 w1),可以方便地进行停止或重启操作。
以上就是 Django Celery 异步任务配置与后台守护进程运行的详细内容,更多关于 Django 异步处理与 Celery 的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









