Grunderna i att arbeta med zmq i python, skapa ett enkelt nyckel-/värdelager

Inledning

Låt oss titta på ett exempel på en enkel nyckel/värdelagring, till exempel memcache. Det är enkelt utformat - data lagras i minnet, i en hashmap-struktur. De nås via ett tcp-uttag. I Python är hashmap en vanlig dikt. För åtkomst kommer vi att använda zeromq.

justering

För att installera det här paketet i debian/ubuntu, skriv bara in i konsolen
sudo apt-get install libzmq-dev
sudo pip install zmq

Kod

Låt oss skriva en klass för att arbeta med vår server:
Typen av zmq-socket som används är REQ(REQuest, request), vi skickar en förfrågan och väntar på svar.
För att lagra och överföra alla typer av data över nätverket använder vi den vanliga picklemodulen. Arbetsprotokollet är en tupel av tre värden: (kommando, nyckel, data)

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'
Använd

cache = SuperCacher()
cache.set('nyckel', 'värde')
cache.get('nyckel')

Som läxa, förbättra implementeringen genom att lägga till möjligheten att ange en adress/port när du skapar en instans av en klass.

Låt oss nu skriva själva servern.
Den här gången används socket REP(REPly, response) - vi väntar på begäran och skickar ett svar. Vi analyserar förfrågan och svarar antingen med "ok" när det gäller skrivning, eller med data / Ingen vid läsning.

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

För att testa allt tillsammans startar vi servern med kommandot
python daemon.py

På nästa flik, starta python i interaktivt läge.

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

Åh mirakel, det fungerar! Nu kan du säkert skriva i ditt CV "utveckling av nyckel-värdelagring med hjälp av zmq-protokollet"

Källa: will.com

Lägg en kommentar