我有这段代码,基本上它运行 channel.start_consuming()。 我想让它在一段时间后停止。
我认为 channel.stop_consuming()是正确的方法:
def stop_consuming(self, consumer_tag=None):
""" Cancels all consumers, signalling the `start_consuming` loop to
exit.
但它不起作用:start_consuming()永远不会结束(执行不会退出此调用,"结束"永远不会打印)。
进口单位测试 进口鼠兔 导入线程 进口时间
_url = "amqp://user:password@xxx.rabbitserver.com/aaa"
class Consumer_test(unittest.TestCase):
def test_startConsuming(self):
def callback(channel, method, properties, body):
print("callback")
print(body)
def connectionTimeoutCallback():
print("connecionClosedCallback")
def _closeChannel(channel_):
print("_closeChannel")
time.sleep(1)
print("close")
if channel_.is_open:
channel_.stop_consuming()
print("stop_cosuming")
else:
print("channel is closed")
#channel_.close()
params = pika.URLParameters(_url)
params.socket_timeout = 5
connection = pika.BlockingConnection(params)
#connection.add_timeout(2, connectionTimeoutCallback)
channel = connection.channel()
channel.basic_consume(callback,
queue='test',
no_ack=True)
t = threading.Thread(target=_closeChannel, args=[channel])
t.start()
print("start_consuming")
channel.start_consuming() # start consuming (loop never ends)
connection.close()
print("end")
connection.add_timeout 解决了我的问题,也许也调用了basic_cancel,但我想使用正确的方法。
由于
注意: 由于声誉低,我无法回复或添加评论(pika, stop_consuming does not work)。
注2: 我认为我不是跨线程共享频道或连接(Pika不支持这个),因为我使用"频道_"作为参数传递而不是"频道"班级的实例(我错了吗?)。
答案 0 :(得分:0)
我遇到了同样的问题;因为pika
不是线程安全的。即连接和通道无法跨线程安全共享。
所以我使用了一个单独的连接来发送关机消息;然后停止使用callback
函数中的原始频道。