Celery异步任务核心是消息发送、任务执行与结果处理;需先启动RabbitMQ作为broker,Celery通过pyamqp连接字符串明确指定地址,任务用.delay()触发,Worker进程必须持续运行消费队列。

用 Celery 和 RabbitMQ 做 Python 异步任务,核心就三点:消息能发出去、任务能跑起来、结果可查或可忽略。不靠黑盒配置,关键在理解每个组件的角色和连接逻辑。
RabbitMQ 要先跑起来,别跳过这步
RabbitMQ 是消息中转站(broker),Celery 任务得靠它传话。没启动 RabbitMQ,Celery 就像发不出去的短信——生产者以为发了,其实卡在本地。
- macOS 上用 brew install rabbitmq 安装后,执行 rabbitmq-server 启动服务
- Linux 可用 sudo systemctl start rabbitmq-server
- 验证是否成功:浏览器打开 http://localhost:15672,默认账号密码都是 guest
- 如果打不开,检查 Erlang 是否已安装(RabbitMQ 依赖 Erlang 运行环境)
Celery 实例要明确绑定 RabbitMQ 地址
Celery 不自带消息通道,必须显式告诉它“Broker 在哪”。常见错误是只写 pyamqp:// 却漏掉用户、密码、host 或端口。
- 标准连接字符串格式:pyamqp://guest:guest@localhost:5672//
- 在 Celery 应用初始化时设置:
app = Celery('tasks', broker='pyamqp://guest:guest@localhost:5672//') - 若改用 vhost(比如 /myvhost),记得 URL 末尾双斜杠前加 vhost 名:
pyamqp://guest:guest@localhost:5672/myvhost
任务定义与触发要分清“声明”和“执行”
@task 装饰器只是注册任务,调用 .delay() 或 .apply_async() 才真正把消息推到 RabbitMQ 队列里。
立即学习“Python免费学习笔记(深入)”;
- 定义任务示例:
@app.task def send_email(to, subject): ... - 触发异步执行:
send_email.delay('user@example.com', 'Welcome') - 不要在 Web 请求中直接调用
send_email()(同步执行),否则仍会阻塞响应 - 如需获取返回值,启用 result backend(如 Redis),并用
.get(timeout=10)等待结果
Worker 进程必须持续运行才能消费任务
Celery Worker 是后台“打工人”,它主动连接 RabbitMQ,拉取队列里的任务并执行。关掉终端或没起 worker,任务就永远躺在队列里不动。
- 启动命令:celery -A tasks worker --loglevel=info(假设任务模块叫 tasks.py)
- 推荐加 --concurrency=4 控制并发数,避免单机压垮资源
- 开发时可用 --pool=solo 简化调试(单线程模式,方便断点)
- 生产环境建议用 systemd 或 supervisor 管理 worker 生命周期










