Celery异步任务核心是消息发送、任务执行与结果处理;需先启动RabbitMQ作为broker,Celery通过pyamqp连接字符串明确指定地址,任务用.delay()触发,Worker进程必须持续运行消费队列。
用 Celery 和 RabbitMQ 做 Python 异步任务,核心就三点:消息能发出去、任务能跑起来、结果可查或可忽略。不靠黑盒配置,关键在理解每个组件的角色和连接逻辑。
RabbitMQ 是消息中转站(broker),Celery 任务得靠它传话。没启动 RabbitMQ,Celery 就像发不出去的短信——生产者以为发了,其实卡在本地。
Celery 不自带消息通道,必须显式告诉它“Broker 在哪”。常见错误是只写 pyamqp:// 却漏掉用户、密码、host 或端口。
app = Celery('tasks', broker='pyamqp://guest:guest@localhost:5672//')
pyamqp://guest:guest@localhost:5672/myvhost
@task 装饰器只是注册任务,调用 .delay() 或 .apply_async() 才真正把消息推到 RabbitMQ 队列里。
@app.task def send_email(to, subject): ...
send_email.delay('user@example.com', 'Welcome')
send_email()(同步执行),否则仍会阻塞响应.get(timeout=10) 等待结果Celery Worker 是后台“打工人”,它主动连接 RabbitMQ,拉取队列里的任务并执行。关掉终端或没起 worker,任务就永远躺在队列里不动。