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