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