我知道pika不是线程安全的,我试图使用锁访问通道,但仍然会出错:
pika.exceptions.ConnectionClosed: (505, 'UNEXPECTED_FRAME - expected content header for class 60, got non content header frame instead')PS我不能使用不同的频道。
我能做什么?谢谢你提前提供帮助
发布于 2018-03-07 15:01:11
您需要重新设计您的应用程序或选择另一个Rabbitmq库而不是Pika。锁不能使皮卡线安全。每个线程需要有一个单独的连接。
您有几个选项,但它们都没有使用锁那么简单。
其中之一就是用Kombu代替Pika。Kombu是线程安全的,但它的界面与Pika非常不同(在我看来更简单,但这是主观的)。
如果您想继续使用Pika,那么您需要重新设计您的兔子界面。我不知道你为什么“不能”使用不同的频道。但是,一种可能的方法是让单个线程与兔子进行接口,该线程将与执行任务的工作线程与接收到的数据进行交互,并且您将通过队列与它们进行通信。通过这种方式,您的兔子线程将读取数据,将接收到的数据发送到队列中的工作人员,通过另一个队列接收工作人员的回答,然后将它们作为响应提交给兔子。
您还可以解开通信协议中的某些内容,这样您实际上可以使用不同的通道,并且每个线程可以独立地与它们自己的连接和通道进行接口。这是我通常使用的方法。
还有一个选择是摆脱线程,转而使用异步方法。您的应用程序可能适合,也可能不适合。
但是没有简单的解决办法,如果您尝试在线程之间共享Pika对象,您最终会遇到奇怪的行为或异常。
https://stackoverflow.com/questions/49154404
复制相似问题