0

各メッセージが受信されるたびに AMQP メッセージの本文を返すコールバック関数があります。本文の内容をグローバル変数に割り当てて、プログラムでさらに操作できるようにしたいと考えています。

スクリプトの先頭にグローバル変数を作成し、コールバック関数内で global キーワードを使用しました。これにより、スクリプトの先頭にあるグローバル変数を更新できるはずですが、「グローバル変数」を別のスクリプトでは、コールバック関数内から body の現在の値ではなく、「test」の元の値が返されます...

Consumer.py

**python/pika imports and credentials go here**

T_MSG = "test" # create global variable

def main():
    logging.basicConfig()

    (username, password) = open(CREDENTIALS_FILE).read().splitlines()
    credentials = pika.PlainCredentials(username, password)
    params = pika.ConnectionParameters(AMQP_HOST, AMQP_PORT, AMQP_EXCHANGE, credentials)
    connection = pika.BlockingConnection(params)

    channel = connection.channel()

    channel.queue_declare(queue=QUEUE_NAME, durable=False)

    def callback(ch, method, properties, body):
        #print "received message: %r" % body

        global T_MSG # Define that I want to work with the global variable

        #assert isinstance(body, object)

        T_MSG = str(body) # assign the value of body to the global variable 

        print T_MSG # this prints out the body as expected

        return T_MSG
        #ch.basic_ack(delivery_tag = method.delivery_tag)

    #channel.basic_qos(prefetch_count=1)

    channel.basic_consume(callback, queue=QUEUE_NAME, no_ack=False)
    print 'waiting for new messages on queue: '
    channel.start_consuming()

Importer.py

from consumer import T_MSG

print T_MSG # this prints the original value of T_MSG e.g. 'Test'

T_MSG の値がコールバック関数内から更新されない理由を理解できません。なぜなら、print ステートメントが body の正しい値を出力していることがはっきりとわかるからです。コールバック関数内でこれをグローバルとして宣言したにもかかわらず、 T_MSG の値をインポートして印刷しようとすると、期待している本文の内容ではなく、最初に割り当てられた 'Test' の値が取得されます...

コールバック関数がメッセージを受信して​​それを「処理」するたびに、body の新しい値を T_MSG (グローバル) 変数に割り当てる必要があるため、それを importer.py スクリプトにインポートできるはずだという印象を受けています。 -しかし、これは機能していません。私が読んだことはすべて、関数内でグローバルキーワードを使用してこれを実現することを示しているだけです...

どんな助けでも大歓迎です!

4

1 に答える 1

0

インポート後、consumer.main() を呼び出して変数を変更する必要があります。

import consumer
print consumer.T_MSG  # here you should see the original value
consumer.main()
print consumer.T_MSG  # now it will be updated
于 2016-12-01T19:40:09.100 に答える