Osnove dela z zmq v pythonu, ustvarjanje preproste shrambe ključ/vrednost

Predstavitev

Oglejmo si primer preprostega pomnilnika ključ/vrednost, kot je memcache. Zasnovan je preprosto - podatki so shranjeni v pomnilniku, v strukturi hashmapa. Do njih se dostopa prek vtičnice tcp. V Pythonu je hashmap običajni dikt. Za dostop bomo uporabili zeromq.

prilagoditev

Če želite namestiti ta paket v debian/ubuntu, preprosto vnesite v konzolo
sudo apt-get install libzmq-dev
sudo pip install zmq

Koda:

Napišimo razred za delo z našim strežnikom:
Vrsta uporabljene vtičnice zmq je REQ(REQuest, request), pošljemo zahtevo in čakamo na odgovor.
Za shranjevanje in prenos katere koli vrste podatkov po omrežju uporabljamo standardni modul pickle. Delovni »protokol« je niz treh vrednosti: (ukaz, ključ, podatki)

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

predpomnilnik = SuperCacher()
cache.set('ključ', 'vrednost')
cache.get('ključ')

Kot domačo nalogo izboljšajte izvedbo tako, da dodate možnost podajanja naslova/vrat pri ustvarjanju primerka razreda.

Zdaj pa napišimo sam strežnik.
Tokrat je uporabljena vtičnica REP(REPly, odgovor) - čakamo na zahtevo, pošiljamo odgovor. Zahtevo razčlenimo in odgovorimo z 'ok' v primeru pisanja ali s podatkom / Brez v primeru branja.

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

Da vse skupaj preizkusimo, zaženemo strežnik z ukazom
python daemon.py

V naslednjem zavihku zaženite python v interaktivnem načinu.

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

O čudež, deluje! Zdaj lahko varno napišete v svoj življenjepis "razvoj shranjevanja ključa in vrednosti z uporabo protokola zmq"

Vir: www.habr.com

Dodaj komentar