Python'da zmq ile çalışmanın temelleri, basit bir anahtar/değer deposu oluşturma

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

DDoS korumalı siteler, VPS VDS sunucuları için güvenilir hosting satın alın 🔥 DDoS korumalı, güvenilir VPS ve VDS sunucu barındırma hizmeti satın alın | ProHoster