我知道pika不是线程安全的,我试图使用锁来访问通道,但仍然收到错误:
pika.exceptions.ConnectionClosed: (505, 'UNEXPECTED_FRAME - expected content header for class 60, got non content header frame instead')
PS i 不能使用其他频道。
我能做什么?提前感谢您的帮助
您需要重新设计您的应用程序或选择另一个 Rabbitmq 库而不是 Pika。 锁不会使 Pika 线安全。每个线程都需要有一个单独的连接。
您有几个选项,但没有一个像使用锁那么简单。
一种是用海带取代皮卡。Kombu是线程安全的,但界面与Pika有很大不同(在我看来更简单,但这是主观的)。
如果你想继续使用Pika,那么你需要重新设计你的Rabbit界面。我不知道为什么你"不能"使用不同的频道。但是一种可能的方法是让单个线程与 Rabbit 接口,该线程将与使用接收到的数据执行任务的工作线程进行交互,并且您将通过队列与它们进行通信。这样,您的 Rabbit 线程将读取数据,将接收到的数据发送给队列中的工作线程,通过另一个队列接收来自工作线程的答案,然后将它们作为响应提交给 Rabbit。
您还可以解开通信协议中的某些内容,以便实际上可以使用不同的通道,并且每个线程都可以将 Rabbit 与自己的连接和通道独立地接口。这是我通常使用的方法。
另一个候选者是摆脱线程并开始使用异步方法。您的应用程序可能适合也可能不适合此。
但是没有简单的解决方法,如果您尝试在线程之间共享 Pika 对象,您最终会遇到奇怪的行为或异常。