Bases du travail avec zmq en python, création d'un simple magasin clé/valeur

introduction

Regardons un exemple de stockage clé/valeur simple, tel que Memcache. Sa conception est simple : les données sont stockées en mémoire, dans une structure hashmap. Ils sont accessibles via un socket TCP. En Python, hashmap est un dict classique. Pour l'accès, nous utiliserons zeromq.

réglage

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), nous envoyons une requête et attendons une réponse.
Pour stocker et transmettre tout type de données sur le réseau, nous utilisons le module pickle standard. Le « protocole » de travail est 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'
l'utilisation de

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

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

Écrivons maintenant le serveur lui-même.
Cette fois, le socket REP(REPly, réponse) est utilisé - nous attendons la demande et envoyons une réponse. Nous analysons la requête et répondons soit par 'ok' en cas d'écriture, soit par data / None en cas de 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, on démarre le serveur avec la commande
python daemon.py

Dans l'onglet suivant, lancez python en mode interactif.

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

Oh miracle, ça marche ! Vous pouvez désormais écrire en toute sécurité dans votre CV « développement du stockage clé-valeur à l'aide du protocole zmq »

Source: habr.com

Ajouter un commentaire