GrundlĂŠggende arbejde med zmq i python, oprettelse af et simpelt key/value lager

Introduktion

Lad os se pĂ„ et eksempel pĂ„ et simpelt key/value-lager, som f.eks. memcache. Det er enkelt opbygget – data opbevares i hukommelsen i en hashmap-struktur. Adgang til dem sker via en tcp-socket. I Python er hashmap en almindelig dict. Vi bruger zeromq til at fĂ„ adgang.

Indstillinger

For at installere denne pakke i debian/ubuntu er det tilstrĂŠkkeligt at indtaste i konsollen
sudo apt-get install libzmq-dev
sudo pip install zmq

Kode

Lad os skrive en klasse til at arbejde med vores serveren:
Type af den anvendte zmq-socket – REQ (REQuest, anmodning), vi sender en anmodning – venter pĂ„ svar.
For at gemme og overfĂžre enhver datatype over nettet bruger vi standardmodulet pickle. "Protokollen" for arbejdet er et tuple med tre vĂŠrdier: (kommando, nĂžgle, 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'
Brugen af

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

Som en hjemmeopgave – forbedr implementeringen ved at tilfþje mulighed for at angive adresse/port ved oprettelse af en instans af klassen.

Nu lad os skrive selve server.
Denne gang bruger vi socket REP (REPly, svar) – vi venter pĂ„ anmodning, sender svar. Vi analyserer anmodningen, svarer enten 'ok' ved skrivning eller data / None ved 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()

For at teste det hele sammen starter vi serveren med kommandoen
python daemon.py

I den nĂŠrliggende fane starter vi python i interaktiv tilstand.

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

Oh mirakel, det virker! Nu kan du trygt skrive i dit CV "udvikling af et key-value-lager med brug af zmq-protokollen"

Kilde: habr.com

KĂžb pĂ„lidelig webhosting med DDoS-beskyttelse, VPS VDS-servere đŸ”„ KĂžb pĂ„lidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster