如何配置Django+Celery+Redis实现远程服务器执行Celery任务
跨机器部署Django+Celery+Redis实现GPU加速任务处理
一、方案可行性
完全可行。Celery本身为分布式任务队列设计,只要三台机器共享同一个Redis消息中间件,就能将trout/tsunami发起的任务定向到t-rex的Celery Worker执行,执行完成后结果可返回至发起节点。
二、详细配置步骤
1. 配置共享Redis消息中间件
- 在t-rex上修改Redis配置文件(通常为
/etc/redis/redis.conf):- 将
bind 127.0.0.1改为bind 0.0.0.0,允许远程机器连接 - 将
protected-mode yes改为protected-mode no(生产环境建议配合密码认证,添加requirepass your_strong_password) - 重启Redis服务:
sudo systemctl restart redis-server - 开放防火墙端口:
sudo ufw allow 6379/tcp
- 将
- 在三台机器的Django项目
settings.py中配置Celery的broker和result backend指向t-rex的Redis:CELERY_BROKER_URL = 'redis://t-rex-ip:6379/0' # 若设置密码,格式为redis://:password@t-rex-ip:6379/0 CELERY_RESULT_BACKEND = 'redis://t-rex-ip:6379/0'
2. 启动t-rex的Celery Worker
- 确保t-rex上的代码库与trout/tsunami完全一致,且已安装带CUDA支持的dlib
- 启动Worker时指定专属队列(比如
cuda_tasks),确保任务只由GPU节点处理:celery -A your_django_project worker -Q cuda_tasks --loglevel=info --concurrency=4 # concurrency根据GPU核心数调整
3. 在trout/tsunami提交任务到GPU队列
- 提交任务时指定队列,将任务定向到t-rex的Worker:
# 假设任务函数定义在tasks.py中 from .tasks import image_processing_task # 提交任务到cuda_tasks队列 task_result = image_processing_task.apply_async(args=[image_path, params], queue='cuda_tasks') # 获取结果(同步等待或异步查询) result = task_result.get(timeout=3600) # 根据任务耗时调整超时时间
4. 处理结果返回
- 文件结果:
- 方案1:在t-rex的任务函数中,将处理后的文件上传到三台机器都能访问的共享存储(如NFS、SMB),返回文件路径给发起节点后由其读取
- 方案2:将小文件内容序列化后通过Celery结果后端返回
- 数据库写入:
- 建议在任务函数中通过远程连接写入发起节点的MySQL数据库(需配置数据库允许t-rex访问),或返回处理后的数据由发起节点写入本地数据库,避免跨机器权限风险
三、dlib的CUDA支持问题
不会阻碍计划。原因如下:
- 只有执行任务的t-rex需要带CUDA编译的dlib,trout/tsunami上的dlib仅用于提交任务,不会执行任何依赖CUDA的计算逻辑
- 注意:确保任务函数中的所有GPU加速代码都在Celery任务内部执行,不要在trout/tsunami的Django进程中调用依赖CUDA的dlib方法
四、额外注意事项
- 网络连通性:确保三台机器之间能访问Redis端口(6379),以及共享存储/数据库端口
- 依赖一致性:除dlib的CUDA差异外,其他Python依赖包版本需完全一致,避免任务序列化/反序列化错误
- 超时配置:在
settings.py中调整Celery超时参数,适配GPU任务耗时:CELERY_TASK_TIME_LIMIT = 7200 # 任务最大执行时间,单位秒 CELERY_TASK_SOFT_TIME_LIMIT = 7000 - 任务监控:可通过
celery -A your_django_project flower启动监控工具,实时查看任务状态
内容的提问来源于stack exchange,提问作者user1045680
相关产品推荐
相关产品推荐

