0

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

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

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

我能做什么?提前感谢您的帮助

4

1 回答 1

1

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

你有几个选择,但没有一个比使用锁那么简单。

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

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

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

另一个候选者是摆脱线程并开始使用异步方法。您的应用程序可能适合也可能不适合。

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

于 2018-03-07T15:01:11.773 回答