Maison  >  Article  >  développement back-end  >  Introduction à Pyzmq

Introduction à Pyzmq

coldplay.xixi
coldplay.xixiavant
2020-09-02 17:19:4135199parcourir

[Recommandations d'apprentissage associées : tutoriel Python]

Introduction à Pyzmq

ZMQ (ci-après ZeroMQ appelé ZMQ) est une couche de transport simple et facile à utiliser, une bibliothèque de sockets comme un framework, qui simplifie la programmation Socket, plus concis et plus performant.

est une bibliothèque de files d'attente de traitement de messages qui évolue de manière élastique sur plusieurs threads, cœurs et boîtes hôtes. L'objectif déclaré de ZMQ est de « faire partie de la pile de protocoles réseau standard et d'entrer plus tard dans le noyau Linux ».

ZMQ rend l'écriture d'applications réseau hautes performances extrêmement simple et amusante.

ZeroMQ n'est pas une encapsulation de socket et ne peut pas être utilisé pour implémenter des protocoles réseau existants.

Il a son propre mode, qui est différent du mode de communication point à point de niveau inférieur.

Il a un protocole de niveau supérieur au protocole TCP. (Bien sûr, ZeroMQ n'est pas nécessairement basé sur le protocole TCP, il peut également être utilisé pour la communication inter-processus et intra-processus)

zeromq n'est pas similaire à la file d'attente de messages rabbitmq, c'est en fait, juste un composant de file d'attente de messages et une bibliothèque.


Pyzmq官网: zeromq.org/languages/python/
Github github.com/zeromq/pyzmq
Docs zeromq.github.io/pyzmq/
Guide zguide.zeromq.org/py:all

Télécharger

pip install pyzmq

Plusieurs modes de Pyzmq

1. Demande-Réponse (rep et req)

Les messages sont bidirectionnels, entrants et sortants. Pour les messages demandés par le côté req, le côté req doit répondre au côté req. >

2. Modèle de publication par abonnement (pub et sub)

Les messages sont à sens unique, il n'y a pas de retour. Le côté publication peut publier des messages sur des sujets spécifiques, et le côté abonné peut s'abonner aux sujets qu'il aime. Le côté abonné ne recevra que les sujets auxquels il est abonné. L'éditeur publie un message qui peut être reçu par plusieurs abonnés.

3. Mode push pull

Les messages sont à sens unique et il n'y a pas de retour. Pour tout message poussé, une seule extrémité d'extraction recevra le message.

Le mode proxy et le mode de routage suivants sont tous des extensions ou des mutations des trois modes de base.

1. Mode Requête-Réponse (modèle de requête-réponse) :

Après les requêtes du client, le serveur doit répondre

par le client Initier une demande et attendez que le serveur réponde à la demande. Du côté client, il doit y avoir une paire d'envoi et de réception

Au contraire, du côté serveur, il doit y avoir une paire d'envoi et de réception ; Le serveur et le client peuvent être dans un modèle 1:N. Habituellement, 1 est considéré comme le serveur et N comme le client.

ZMQ peut très bien prendre en charge la fonction de routage (le composant qui implémente la fonction de routage s'appelle Device), étendant 1:N à N:M (seuls quelques nœuds de routage doivent être ajoutés).

Dans ce modèle, les adresses des points de terminaison de niveau inférieur sont masquées des couches supérieures. L'adresse de réponse est implicite dans chaque requête et l'application s'en fiche

Serveur :

sever.py
 import zmq import sys
 context = zmq.Context()
 socket = context.socket(zmq.REP)
 socket.bind("tcp://*:5555")
 while True:
  try:
  print("wait for client ...")
  message = socket.recv()
  print("message from client:", message.decode('utf-8'))
  socket.send(message)
  except Exception as e:
  print('异常:',e)
  sys.exit()

Client :

#client.py

 import zmq import sys
 context = zmq.Context()
 print("Connecting to server...")
 socket = context.socket(zmq.REQ)
 socket.connect("tcp://localhost:5555")
 while True:
 
  input1 = input("请输入内容:").strip()
  if input1 == 'b':
  sys.exit()
  socket.send(input1.encode('utf-8'))
 
  message = socket.recv()
  print("Received reply: ", message.decode('utf-8'))

2. Mode publication-abonnement (modèle de publication-abonnement) :

Diffusion Tous les clients, sans cache de file d'attente, les données de déconnexion seront perdues à jamais. Le client peut effectuer un filtrage des données.

Serveur

server.py

 import zmq import time import sys
 context = zmq.Context()
 socket = context.socket(zmq.PUB)
 socket.bind("tcp://*:5555")
 
 while True:
  msg = input("请输入要发布的信息:").strip()
  if msg == 'b':
  sys.exit()
  socket.send(msg.encode('utf-8'))
  time.sleep(1)
Client1

client1.py

 import zmq
 
 
 context = zmq.Context()
 socket = context.socket(zmq.SUB)
 socket.connect("tcp://localhost:5555")
 socket.setsockopt(zmq.SUBSCRIBE,''.encode('utf-8'))  # 接收所有消息 while True:
  response = socket.recv().decode('utf-8');
  print("response: %s" % response)
Client Terminal 2

client2.py

 import zmq
 context = zmq.Context()
 socket = context.socket(zmq.SUB)
 socket.connect("tcp://localhost:5555")
 socket.setsockopt(zmq.SUBSCRIBE,'123'.encode('utf-8'))  # 消息过滤  只接受123开头的信息 while True:
  response = socket.recv().decode('utf-8');
  print("response: %s" % response)

3. Mode pipeline parallèle (modèle de pipeline) :

Il se compose de trois parties, pousser pour pousser les données, le travail s'effectue. la mise en cache des données et pull effectue le traitement d'acquisition de compétition de données. Contrairement à la publication-abonnement, il existe un cache de données et une charge de traitement.

Lorsque la connexion est déconnectée, les données ne seront pas perdues et les données continueront à être envoyées au homologue après la reconnexion.

server.py

 import zmq import time
 
 context = zmq.Context()
 socket = context.socket(zmq.PUSH)
 socket.bind("tcp://*:5557")
 
 while True:
  msg = input("请输入要发布的信息:").strip()
  socket.send(msg.encode('utf-8'))
  print("已发送")
  time.sleep(1)
worker.py

 import zmq
 context = zmq.Context()
 receive = context.socket(zmq.PULL)
 receive.connect('tcp://127.0.0.1:5557')
 sender = context.socket(zmq.PUSH)
 sender.connect('tcp://127.0.0.1:5558')
 
 while True:
  data = receive.recv()
  print("正在转发...")
  sender.send(data)
client.py

 import zmq
 context = zmq.Context()
 socket = context.socket(zmq.PULL)
 socket.bind("tcp://*:5558")
 
 while True:
  response = socket.recv().decode('utf-8')
  print("response: %s" % response)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer