Giriş
Memcache gibi basit bir anahtar/değer depolama örneğine bakalım. Basit bir şekilde tasarlanmıştır; veriler hafızada, bir hashmap yapısında saklanır. Bunlara bir tcp soketi aracılığıyla erişilir. Python'da hashmap düzenli bir diktedir. Erişim için Zeromq kullanacağız.
Ayar
Bu paketi yüklemek için... debian/ubuntu Konsola girmeniz yeterli.
sudo apt-get install libzmq-dev
sudo pip install zmq
Kod
Bizimle çalışacak bir sınıf yazalım. sunucu:
Kullanılan zmq soket tipi REQ(REQuest, request), request gönderiyoruz ve yanıt bekliyoruz.
Ağ üzerinden her türlü veriyi depolamak ve iletmek için standart turşu modülünü kullanıyoruz. Çalışma "protokolü" üç değerden oluşan bir demettir: (komut, anahtar, veri)
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'
kullanımı
önbellek = SuperCacher()
önbellek.set('anahtar', 'değer')
önbellek.get('anahtar')
Ev ödevi olarak, bir sınıfın örneğini oluştururken adres/bağlantı noktası belirtme yeteneğini ekleyerek uygulamayı geliştirin.
Şimdi bunu kendimiz yazacağız. sunucu.
Bu sefer soket REP(REPly, yanıt) kullanılır - isteği bekliyoruz, yanıt gönderiyoruz. İsteği ayrıştırırız ve yazma durumunda 'tamam', okuma durumunda veri / Yok ile yanıt veririz.
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()
Her şeyi birlikte test etmek için sunucuyu şu komutla başlatıyoruz:
python daemon.py
Bir sonraki sekmede python'u etkileşimli modda başlatın.
>>> from lib import SuperCacher
>>> cache=SuperCacher()
>>> cache.set('key', 'value')
True
>>> cache.get('key')
'value'
Ah mucize, işe yarıyor! Artık özgeçmişinize "zmq protokolünü kullanarak anahtar-değer depolamasının geliştirilmesi" konusunu güvenle yazabilirsiniz.
Kaynak: habr.com
