python - 在后台运行 pika ioloop 或使用自定义 ioloop

标签 python multithreading rabbitmq amqp

我觉得这应该不是那么难,但到目前为止我收效甚微。

假设我有一个名为 PikaClass 的类,它包装了 pika并提供了一些业务方法。

def PikaClass(object):
  def __init__(self):
     # connect to the broker
     self.connection = pika.SelectConnection(<connection parameters>, self.on_connect)
     # ..other init stuff..

  def on_connect(self, connection):
     # called when the connection has been established 
     # ..open a channel, declare some queues, etc.

  def start(self):
     # start the polling loop 
     self.connection.ioloop.start()

  def foo(self, **kwargs):
     # do some business logic, e.g., send messages to particular queues

直觉上,这就是我想要实现的:用户创建一个 PikaClass 的实例,设置循环在后台运行,然后通过调用某些业务方法与对象进行交互

p = PikaClass()
p.start()
bar = p.foo(..)

问题是 p.start() 会在调用 start() 后阻塞并阻止主代码与对象交互。我的第一个想法是将调用包装在一个线程中:

Thread(target=p.start()).start()
bar = p.foo(..)

但这仍然会阻塞,你永远无法到达 p.foo(..)。文档提到您不应该在线程之间共享连接,这样可能会在某处引起问题。

我也尝试过使用 AsyncoreConnection 而不是 SelectConnection,并直接调用 _connect()(而不是使用 ioloop),但这没有任何效果(没有任何反应)。

那么如何在后台运行 ioloop,或者至少运行我自己的 ioloop?

注意:这是 win64 (xp) 上的 Python 2.6,最新的 pika 0.9.4

最佳答案

您正在调用“p.start”而不是将其作为参数传递。代码应该是:

Thread(target=p.start).start()

Thread会在Thread.start执行时调用p.start。

我不确定这是否能解决您的问题,但它可能会帮助您找到解决方案。

关于python - 在后台运行 pika ioloop 或使用自定义 ioloop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5273686/

相关文章:

Python/Keras - 如何访问每个时期的预测?

python - Elasticsearch 不敏感搜索重音

c++ - ZeroMQ后台线程创建

java - Activity 生成一个线程,但随后该 Activity 被销毁,或者在子线程完成之前创建一个新 Activity (在同一任务中)

c# - 将文件发送到队列 RabbitMQ

Python Quantlib : How to deal with RuntimeError 'addFixing(date, value)'

python - driver.quit() 和 pkill chrome 释放内存的效果一样吗?

windows - Cocoa、Windows 和线程?

php - 用于大量 MySql 插入和更新的 RabbitMQ?

rabbitmq - docker rabbitmq 主机名问题