【问题标题】:Running RabbitMQ Pika with Quart用 Quart 运行 RabbitMQ Pika
【发布时间】:2021-02-22 14:24:53
【问题描述】:

我正在使用 Quart 框架,但我还需要使用 RabbitMQ Pika 连接器,但我无法让它们玩得很好,因为它们都有无限循环。

入口点:

from quart import Quart
from .service import Service

app = Quart(__name__)

@app.before_serving
async def startup():
app.service_task = asyncio.ensure_future(service.start())

if not service.initialise():
    sys.exit()

服务类:

class Service:
def __init__(self, new_instance):
    self._connection = None
    self._channel = None
    self._messaging_thread = None

def initialise(self):

    credentials = pika.PlainCredentials('username', 'password')
    parameters = pika.ConnectionParameters('localhost', credentials=credentials)
    self._connection = pika.BlockingConnection(parameters)
    self._channel = self._connection.channel()
    self._channel.queue_declare(queue='to_be_processed_queue')

    self._channel.basic_consume(queue='to_be_processed_queue',
                                auto_ack=True,
                                on_message_callback=self.callback)
  
    print('creating thread')
    self._messaging_thread = Thread(target=self.run_consume())
    #self._messaging_thread.start()
    print('Thread created...')

def run_consume(self):
    try:
        self._channel.start_consuming()
    except KeyboardInterrupt:
        self._shutdown()

代码甚至没有到达 print('Thread created...'),我不明白。从this question 我明白 RabbitMQ 不是线程安全的,但我不明白如何运行 RabbitMQ。

【问题讨论】:

    标签: python rabbitmq pika quart


    【解决方案1】:

    您已经发现 Pika 不是线程安全的,但这不是您的程序阻塞的原因。

    你的问题可能在这里:

    print('creating thread')
    self._messaging_thread = Thread(target=self.run_consume())
    #self._messaging_thread.start()
    

    如果从 run_consume 中删除括号会更好吗?现在你实际上不是在创建线程,而是当场执行self.run_consume(),它并没有退出。

    self._messaging_thread = Thread(target=self.run_consume)
    

    将是我的第一次尝试。

    但是,由于 Pika 不是线程安全的,因此您还必须将频道创建和内容移至您的线程,而不是在主程序中进行。如果您没有在其他任何地方使用它,它可能会起作用,但使用 Pika 的正确方法是绝对包含线程中的所有内容,并且不要像现在在这里那样在线程之间共享任何 Pika 结构。

    【讨论】:

    • 去掉括号解决了问题,谢谢! (facepalm) 将结构移到线程上也有助于解决我看到的稳定性问题。
    猜你喜欢
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多