You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python合并运行RabbitMQ收发脚本时触发KeyboardInterrupt崩溃如何解决

问题排查结果
  • 你遇到的KeyboardInterrupt报错并非程序自发崩溃:channel.start_consuming()是pika库的阻塞式无限轮询方法,启动后会一直占用当前线程监听队列消息,无消息时会持续阻塞不退出,报错是你手动按下Ctrl+C中断程序触发的。
  • 执行逻辑顺序有误:你先运行Sender.send()发送消息、再启动消费者监听,若未开启队列/消息持久化配置,发送的消息会因为没有在线消费者直接丢失,后续启动的消费者也收不到之前的消息。
  • 串行执行逻辑无法满足同时运行的需求:Receiver.receive()启动后会完全占住主线程,之后没有其他业务逻辑可以执行。
可行解决方案

方案1:多线程改造(适合测试场景)

用子线程运行消费者,避免阻塞主线程的消息发送逻辑,示例代码如下:

import Sender, Receiver
import threading
import time

# 子线程启动消费者,daemon设为True保证主程序退出时消费者线程同步退出
consumer_thread = threading.Thread(target=Receiver.receive, daemon=True)
consumer_thread.start()

# 等待消费者初始化完成,可根据实际运行环境调整延时
time.sleep(1)

# 主线程执行消息发送
Sender.send()

# 等待消费者处理完消息,可设置超时时间避免无限等待
consumer_thread.join(timeout=5)

同时修改Receiver的消费回调,处理完指定消息后主动结束轮询,避免一直阻塞:

# Receiver.py内的消费回调示例
def message_callback(ch, method, properties, body):
    print(f"接收到消息:{body.decode()}")
    # 业务处理逻辑
    # ...
    # 处理完成后主动停止消费
    ch.stop_consuming()

方案2:独立进程运行(生产环境推荐)

正式使用时不建议将二者合并到同一个进程运行,避免单进程故障同时影响消息生产和消费,保持两个脚本独立启动即可,若需要消费者后台长期运行,直接将Receiver脚本设置为后台进程/系统服务即可。

内容的提问来源于stack exchange,提问作者Alexander

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 14:54:04