L'article ci-dessus parle de la file d'attente de travail. Chaque message ne sera envoyé qu'à l'un des récepteurs. Si vous devez diffuser le message afin que chaque récepteur puisse le recevoir, vous devez utiliser un commutateur.
Le principe de fonctionnement du commutateur : l'extrémité d'envoi du message envoie d'abord le message au commutateur, et le commutateur envoie ensuite le message à la file d'attente des messages liée, puis chacun l'extrémité de réception peut recevoir des informations dans leurs files d'attente de messages respectives.
Principe de fonctionnement du commutateur Rabbitmq
Ce qui suit utilise send.py et contain.py pour simuler la fonction de l'interrupteur. send.py représente l'extrémité émettrice et recevoir.py représente l'extrémité réceptrice.
Analyse du code recevoir.py
Par rapport à recevoir.py dans le premier article, il fait principalement deux changements ont été créés :
Définir le commutateur
Au lieu d'utiliser la file d'attente hello, une file d'attente temporaire est générée aléatoirement et liée au commutateur
#!/usr/bin/env python #coding=utf8 import pika connection= pika.BlockingConnection(pika.ConnectionParameters( 'localhost')) channel= connection.channel() #定义交换机 channel.exchange_declare(exchange='messages',type='fanout') #随机生成队列,并绑定到交换机上 result= channel.queue_declare(exclusive=True) queue_name= result.method.queue channel.queue_bind(exchange='messages', queue=queue_name) def callback(ch, method, properties, body): print " [x] Received %r" % (body,) channel.basic_consume(callback, queue=queue_name, no_ack=True) print ' [*] Waiting for messages. To exit press CTRL+C' channel.start_consuming()
Dans l'exemple de code ci-dessus, queue_declare Le paramètre exclusive=True signifie que lorsque l'extrémité réceptrice se termine, la file d'attente générée temporairement sera détruite afin que les ressources ne soient pas occupées. Exécutez ce programme, puis utilisez la commande Rabbitmqctl list_exchanges pour afficher les informations sur le commutateur :
affichage des informations sur le commutateur Rabbitmq
où rouge Le cadre est le commutateur défini dans l'exemple ci-dessus. Utilisez ensuite Rabbitmqctl list_queues pour vérifier la situation de la file d'attente des messages :
Affichage des informations sur la file d'attente Rabbitmq
La case rouge est aléatoire file d'attente de messages générée.
Analyse du code send.py
Par rapport à send.py dans le premier article, je n'ai fait que deux changements :
Définir l'échange
Au lieu d'envoyer le message à la file d'attente hello, il l'envoie à l'échange
#!/usr/bin/env python #coding=utf8 import pika connection= pika.BlockingConnection(pika.ConnectionParameters( 'localhost')) channel= connection.channel() #定义交换机 channel.exchange_declare(exchange='messages',type='fanout') #将消息发送到交换机 channel.basic_publish(exchange='messages', routing_key='', body='Hello World!') print " [x] Sent 'Hello World!'" connection.close()
Dans l'exemple de code ci-dessus, le paramètre échange du basic_publish La méthode est définie Pour le commutateur correspondant, car elle est diffusée et envoyée à toutes les files d'attente, Routing_key n'a pas besoin d'être défini.
Si l'échange est vide, cela signifie qu'un commutateur anonyme est utilisé. Dans l'image des informations sur le commutateur ci-dessus, vous pouvez voir qu'il existe un commutateur comme amq.*, qui est le commutateur par défaut du système. Routing_key ne doit être spécifié que lors de l'utilisation d'un commutateur anonyme, indiquant à quelle file d'attente il est envoyé. L'exemple du premier article illustre cette fonctionnalité.
Ouvrez un autre terminal et exécutez send.py Vous pouvez constater que recevoir.py a reçu le message. Si plusieurs terminaux exécutent recevoir.py, chaque récepteur.py recevra le message.
Ce qui précède est le contenu de l'utilisation de Python Rabbitmq (3). Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !