各メッセージが受信されるたびに 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 スクリプトにインポートできるはずだという印象を受けています。 -しかし、これは機能していません。私が読んだことはすべて、関数内でグローバルキーワードを使用してこれを実現することを示しているだけです...
どんな助けでも大歓迎です!