Principi di travagliu cù zmq in python, creendu un magazzinu simplice di chjave / valore

Introduzione

Fighjemu un esempiu di un almacenamentu simplice di chjave / valore, cum'è memcache. Hè cuncepitu simplicemente - i dati sò guardati in memoria, in una struttura di hashmap. Sò accessu via un socket tcp. In Python, hashmap hè un dittu regulare. Per accessu avemu aduprà zeromq.

cutter

Per installà stu pacchettu in debian/ubuntu, basta entre in a cunsola
sudo apt-get install libzmq-dev
sudo pip install zmq

codice

Scrivemu una classa per travaglià cù u nostru servitore:
U tipu di socket zmq utilizatu hè REQ (RICHIESTA, dumanda), mandemu una dumanda è aspittemu una risposta.
Per almacenà è trasmette ogni tipu di dati nantu à a reta, usemu u modulu di pickle standard. U travagliu "protokollu" hè una tupla di trè valori: (cumandamentu, chjave, dati)

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'
Usu

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

Cum'è i travaglii di casa, migliurà l'implementazione aghjunghjendu a capacità di specificà un indirizzu / portu quandu crea una istanza di una classe.

Avà scrivemu u servitore stessu.
Questa volta u socket REP (REPly, risposta) hè utilizatu - aspittemu a dumanda, mandendu una risposta. Analizemu a dumanda è rispondimu o cù "ok" in u casu di scrittura, o cù dati / Nisunu in u casu di lettura.

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

Per pruvà tuttu inseme, avemu principiatu u servitore cù u cumandimu
python daemon.py

In a tabulazione dopu, lanciate python in modu interattivu.

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

Oh miraculu, funziona! Avà pudete scrive in modu sicuru in u vostru currículum "sviluppu di l'almacenamiento di valori chjave utilizendu u protocolu zmq"

Source: www.habr.com

Add a comment