【问题标题】:Pika threaded execution gets error - 505, 'UNEXPECTED_FRAMEPika 线程执行出错 - 505, 'UNEXPECTED_FRAME
【发布时间】:2018-03-07 14:33:03
【问题描述】:

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

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

PS 我不能使用其他频道。

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

【问题讨论】:

    标签: python multithreading rabbitmq pika python-pika


    【解决方案1】:

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

    您有几个选择,但没有一个比使用锁更简单。

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

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

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

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

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

    【讨论】:

    • 我从没听说过 Kombu……它稳定吗?而且我在文档中找不到任何关于它是线程安全的
    • 有一些位不是线程安全的(阅读文档),但如果您需要它们,您可以使用锁来保护它们。我从来没有将那些(TokenBucket)用于任何事情。
    • 真的很棒!!非常感谢你!!我用 Kombu 解决了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多