Pika channel.stop_consuming不会停止start_consuming循环

时间:2015-10-04 13:34:15

标签: python rabbitmq pika

我有这段代码,基本上它运行 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不支持这个),因为我使用"频道_"作为参数传递而不是"频道"班级的实例(我错了吗?)。

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题;因为pika不是线程安全的。即连接和通道无法跨线程安全共享。

所以我使用了一个单独的连接来发送关机消息;然后停止使用callback函数中的原始频道。