我觉得这应该不是那么难,但到目前为止我收效甚微。
假设我有一个名为 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/