Rabbitmq и Python NameError: глобальная проблема с именем - PullRequest
1 голос
/ 14 апреля 2020

Я пытаюсь отправить JSON в Rabbitmq. это мой продюсер, и он работает правильно:

import pika
import json

credentials = pika.PlainCredentials('admin', '123')
parameters = pika.ConnectionParameters('192.168.1.11',
                                       5672,
                                       '/',
                                       credentials)
connection = pika.BlockingConnection(parameters)
channel = connection.channel()
channel.queue_declare(queue='myapp')

message = {'fname': 'test', 'lname': 'test'}

channel.basic_publish(exchange='',
                      routing_key='myapp',
                      body=json.dumps(message),
                      properties=pika.BasicProperties(
                         delivery_mode = 2,

                      ))
print(" [x] Sent %r" % message)

connection.close()

Это приемник, и это не нормально:

import pika
import time
import json

credentials = pika.PlainCredentials('admin', '123')
parameters = pika.ConnectionParameters('192.168.1.12',
                                       5672,
                                       '/',
                                       credentials)
connection = pika.BlockingConnection(parameters)
channel = connection.channel()
channel.queue_declare(queue='myapp')

def callback(ch, method, properties, body):
    myjson = json.loads(body)
    global fname
    global lname
    fname = myjson["fname"]
    lname = myjson["lname"]
    my_func(fname,lname)

channel.basic_qos(prefetch_count=1)
channel.basic_consume(queue='myapp',
                      auto_ack=True,
                      on_message_callback=callback)
channel.start_consuming()
def my_func(fname,lname):
    pass

когда я запускаю скрипты, получатель показывает следующую проблему:

NameError: глобальное имя 'my_fun c' не определено

1 Ответ

0 голосов
/ 14 апреля 2020

Проблема связана с этой функцией в вашем приемнике.py

channel.start_consuming ()

Функция заблокирует программу и предотвратит ее просмотр my_fun c (). С другой стороны, инструмент анализа кода, например, Pylint, в большинстве случаев может не обнаружить такую ​​ошибку.

Простое решение - изменить код на

def callback(ch, method, properties, body):
    myjson = json.loads(body)
    global fname
    global lname
    fname = myjson["fname"]
    lname = myjson["lname"]
    my_func(fname,lname)

def my_func(fname,lname):
    pass

channel.basic_qos(prefetch_count=1)
channel.basic_consume(queue='myapp',
                      auto_ack=True,
                      on_message_callback=callback)
channel.start_consuming()

Более сложное решение - создать собственный класс или метод и запустить start_consuming () в асинхронном режиме. Вот мой пример:

def listen(self, exchange, routing, callback):
    self.ReceiveChannel = self.connection.channel()
    consumer_thread = threading.Thread(target=self.__consumer__, args=[exchange, routing, callback])
    consumer_thread.start()
...