Django Celery 异步任务配置与后台守护进程运行指南

Mason
Mason
发布时间:2026-10-12 | 3人浏览过
原创

本文详细讲解如何在 Django 项目中集成 Celery 实现异步任务处理,并通过 Redis 作为消息中间件。文章涵盖 Celery 核心配置、异步函数定义与调用,重点介绍了在 Linux 环境下将 Celery Worker 设为后台守护进程运行的两种方法:使用 nohup 结合脚本,以及利用 screen 工具管理会话。

环境准备与依赖安装

本方案基于 Python 3.6 与 Django 2.0.5 环境。为了简化依赖管理,推荐使用包含 Redis 支持的 Celery 集成包进行安装:

pip install celery-with-redis

Celery 核心配置

在 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_ZONE

3. 确保 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 的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表