Los fundamentos de trabajar con zmq en python, creando un almac茅n simple de clave / valor

Introduccion


Veamos un ejemplo de un almacenamiento simple de clave / valor, como memcache. Simplemente est谩 organizado: los datos se almacenan en la memoria, en la estructura de hashmap. El acceso a ellos es a trav茅s de un z贸calo TCP. En python, hashmap es un dict regular. Para el acceso usaremos zeromq.

Personalizaci贸n


Para instalar este paquete en debian / ubuntu simplemente ingrese en la consola
sudo apt-get install libzmq-dev
sudo pip install zmq

C贸digo


Escribamos una clase para trabajar con nuestro servidor:
El tipo de socket zmq utilizado es REQ (REQuest, request), env铆a la solicitud y espera una respuesta.
Para almacenar y transferir cualquier tipo de datos a trav茅s de la red, utilizamos el m贸dulo de pickle est谩ndar. "Protocolo" de trabajo: una tupla de tres valores: (comando, clave, datos)

 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' 


Uso

cach茅 = SuperCacher ()
cache.set ('clave', 'valor')
cache.get ('clave')

Como tarea, mejore la implementaci贸n agregando la capacidad de especificar una direcci贸n / puerto al crear una instancia de la clase.

Ahora escribiremos el servidor en s铆.
Esta vez, se usa el conector REP (REPly, respuesta): estamos esperando la solicitud, el casco es la respuesta. Analizamos la solicitud, respondemos 'ok' en el caso de la escritura o data / None en el caso de la lectura.

 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() 


Para probar todo junto, inicie el servidor con el comando
python daemon.py

En la siguiente pesta帽a, inicie Python de forma interactiva.

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


隆Oh milagro, funciona! Ahora puede escribir de forma segura en su curr铆culum "desarrollando almacenamiento de valor-clave utilizando el protocolo zmq"

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


All Articles