Pika 线程执行出现错误 - 505,'UNEXPECTED_FRAME

Pika threaded execution gets error - 505, 'UNEXPECTED_FRAME

我知道 pika 不是线程安全的,我试图解决使用锁访问频道的问题,但仍然出现错误:

pika.exceptions.ConnectionClosed: (505, 'UNEXPECTED_FRAME - expected content header for class 60, got non content header frame instead')

PS我不能使用不同的频道。

我能做什么?预先感谢您的帮助

您需要重新设计您的应用程序或选择除 Pika 之外的其他 Rabbitmq 库。锁不会使 Pika 线程安全。每个线程都需要有一个单独的连接。

您有几个选项,但其中 none 就像使用锁一样简单。

一种是用海带代替鼠兔。 Kombu 是线程安全的,但界面与 Pika 有很大不同(我认为更简单,但这是主观的)。

如果您想继续使用 Pika,则需要重新设计 Rabbit 界面。我不知道你为什么 "cannot" 使用不同的频道。但是这样做的一种可能方法是让一个线程与 Rabbit 接口,并且该线程将与工作线程交互,工作线程使用接收到的数据执行任务,并且您将通过队列与它们进行通信。这样,您的 Rabbit 线程将读取数据,将接收到的数据发送给队列中的工作人员,通过另一个队列从工作人员那里接收答案,然后将它们作为响应提交给 rabbit。

您也许还可以理清通信协议中的某些内容,以便您实际上可以使用不同的通道,并且每个线程都可以通过自己的连接和通道独立地连接 rabbit。这是我通常使用的方法。

还有一个候选方案是摆脱线程并开始使用异步方法。您的应用程序可能适用于此,也可能不适用。

但是没有简单的解决方法,如果您尝试在线程之间共享 Pika 对象,您最终会遇到奇怪的行为或异常。