前景提要:在mac环境中能正常使用的celery及pool多进程的各项功能,但是在Windows环境下无法正常使用,wsl踩过坑无法正常使用,遂切换到 Docker 方案
1、搭建Docker环境
我安装的是Docker桌面版,具体步骤不再赘述
2、编辑 dockerfile 文件
我的 dockerfile 文件放置在项目目录下
# 使用官方 Python 镜像作为基础镜像
FROM python:3.10.14
# 设置容器内的工作目录 /xxx与 docker-compose 文件的 /xxx 一致
WORKDIR /xxx
# 将 requirements.txt 复制到容器中的工作目录
COPY requirements.txt .
# 安装 Python 依赖项
RUN pip install --no-cache-dir -r requirements.txt
# 将应用程序代码复制到容器
COPY . .
# 设置环境变量
ENV PYTHONUNBUFFERED=1
# 公开端口
EXPOSE 8000
# 进行数据库迁移
RUN python manage.py migrate
# 指定容器启动时运行的命令
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
3、编辑 docker-compose.yml 文件
我的 docker-compose.yml 与 dockerfile 文件放置在相同目录,因为redis、db服务在Windows环境下已经运行,所以不需要Docker启动这两个服务
version: '3.8' # 指定 Docker Compose 版本
services:
django: # Django 应用服务
build: . # 指定构建上下文
ports:
- "8000:8000" # 将主机的 8000 端口映射到容器的 8000 端口
volumes: # 设置映射才可以热更新
- .:/xxx # 把当前目录挂载到容器的 /xxx 目录
environment:
- DEBUG=1 # 设置环境变量,启用调试模式
celery-beat: # celery beat
build: .
volumes:
- .:/xxx # 把当前目录挂载到容器的 /xxx 目录, 否则任务可能无法启动
command: celery -A application.celery beat --loglevel=info
celery-worker: # celery worker
build: .
volumes:
- .:/xxx # 把当前目录挂载到容器的 /xxx 目录, 否则任务可能无法启动
command: celery -A application.celery worker -B --loglevel=info
4、打开终端运行项目
docker-compose up --build
8000端口能够正常访问时基本代表启动成功,此时多进程任务也能成功运行。
注意:
在 Docker 容器中,127.0.0.1 指的是容器自身,而不是宿主机。您需要使用宿主机的实际 IP 地址或使用特定的域名。对于 Docker Desktop,您可以使用 host.docker.internal 来访问宿主机。
所以在 Django 项目中我将 DATABASE_HOST、REDIS_HOST 都配置成了host.docker.internal
DATABASE_HOST = 'host.docker.internal'
REDIS_HOST = 'host.docker.internal'
如果你想看到celery的打印信息,可以使用run来调试,正式环境再切换为 delay 或其他
# fn.delay()
fn.run()