Fundamentos del uso de zmq en python, creación de un sencillo almacenamiento key/value

Introducción

Analicemos un ejemplo de un almacén simple de clave/valor, como memcache. Está diseñado de forma sencilla: los datos se almacenan en memoria, en una estructura de hashmap. El acceso a ellos se realiza a través de un socket tcp. En Python, el hashmap es un dict normal. Utilizaremos zeromq para el acceso.

Configuración

Para instalar este paquete en debian/ubuntu, basta con introducir en la consola
sudo apt-get install libzmq-dev
sudo pip install zmq

Código

Escribamos una clase para trabajar con nuestro el servidor:
El tipo de socket zmq que utilizamos es REQ (REQuest, solicitud), enviamos la solicitud y esperamos la respuesta.
Para almacenar y transmitir cualquier tipo de dato por la red, utilizamos el módulo estándar pickle. El "protocolo" de trabajo es 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

cache = SuperCacher()
cache.set('key', 'value')
cache.get('key')

Como tarea para casa, mejore la implementación añadiendo la posibilidad de especificar la dirección/puerto al crear una instancia de la clase.

Ahora escribiremos el servidor.
Esta vez se utiliza un socket REP (REPly, respuesta) — esperamos la solicitud y enviamos la respuesta. Analizamos la solicitud y respondemos con 'ok' en caso de escritura, o con datos / None en caso de 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, ejecutamos el servidor con el comando
python daemon.py

En la pestaña adyacente, ejecutamos python en modo interactivo.

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

¡Oh maravilla, funciona! Ahora puedes agregar con confianza en tu currículum "desarrollo de un almacén clave-valor utilizando el protocolo zmq".

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster