Les bases de l'utilisation de zmq en python, la création d'un simple magasin clé / valeur

Présentation


Regardons un exemple de stockage de clé / valeur simple, tel que memcache. Il est simplement organisé - les données sont stockées en mémoire, dans la structure de hachage. Leur accès se fait via une socket tcp. En python, hashmap est un dict standard. Pour l'accès, nous utiliserons zeromq.

Personnalisation


Pour installer ce paquet dans debian / ubuntu, entrez simplement dans la console
sudo apt-get install libzmq-dev
sudo pip install zmq

Code


Écrivons une classe pour travailler avec notre serveur:
Le type de socket zmq utilisé est REQ (REQuest, request), envoyez la requête et attendez une réponse.
Pour stocker et transférer tout type de données sur le réseau, nous utilisons le module de pickle standard. "Protocole" de travail - un tuple de trois valeurs: (commande, clé, données)

 import zmq import pickle class SuperCacher: def __init__(self): context = zmq.Context() self.socket = context.socket(zmq.REQ) self.socket.connect('tcp://127.0.0.1:43000') def get(self, key): self.socket.send(pickle.dumps(('get', key, None))) return pickle.loads(self.socket.recv()) def set(self, key, data): self.socket.send(pickle.dumps(('set', key, data))) return self.socket.recv() == b'ok' 


Utiliser

cache = SuperCacher ()
cache.set ('clé', 'valeur')
cache.get ('clé')

En guise de devoirs, améliorez l'implémentation en ajoutant la possibilité de spécifier une adresse / port lors de la création d'une instance de la classe.

Nous allons maintenant écrire le serveur lui-même.
Cette fois, la prise REP est utilisée (REPly, réponse) - nous attendons la demande, le casque est la réponse. Nous analysons la demande, répondons soit «ok» dans le cas de l'écriture, soit data / None dans le cas de la lecture.

 import pickle import json import zmq def run_daemon(): memory = {} context = zmq.Context() socket = context.socket(zmq.REP) socket.bind('tcp://127.0.0.1:43000') while True: try: command, key, data = pickle.loads(socket.recv()) if command == 'set': memory[key] = data socket.send(b'ok') elif command == 'get': result = memory.get(key, None) socket.send(pickle.dumps(result)) except Exception as e: print(e) if __name__ == '__main__': run_daemon() 


Pour tout tester ensemble, démarrez le serveur avec la commande
python daemon.py

Dans l'onglet suivant, lancez python de manière interactive.

 >>> from lib import SuperCacher >>> cache=SuperCacher() >>> cache.set('key', 'value') True >>> cache.get('key') 'value' 


Oh miracle, ça marche! Maintenant, vous pouvez écrire en toute sécurité dans votre CV "développer le stockage de valeur-clé en utilisant le protocole zmq"

Source: https://habr.com/ru/post/fr483586/


All Articles