Python-en zmq-ekin lan egiteko oinarriak, gako/balioen biltegi soil bat sortzea

Sarrera

Ikus dezagun gako/balioen biltegiratze sinple baten adibide bat, esate baterako, memcache. Besterik gabe diseinatu da: datuak memorian gordetzen dira, hashmap egitura batean. Tcp socket baten bidez sartzen dira. Python-en, hashmap ohiko diktamena da. Sartzeko zeromq erabiliko dugu.

doikuntza

Pakete hau debian/ubuntu-n instalatzeko, sartu kontsolan
sudo apt-get install libzmq-dev
sudo pip install zmq

Code

Idatz dezagun klase bat gure zerbitzariarekin lan egiteko:
Erabilitako zmq socket mota REQ(REquest, request) da, eskaera bat bidaltzen dugu eta erantzunaren zain.
Sarean edozein motatako datuak gordetzeko eta transmititzeko, pickle modulu estandarra erabiltzen dugu. Lan "protokoloa" hiru balioko tupla bat da: (komandoa, gakoa, datuak)

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

cache = SuperCacher ()
cache.set('gakoa', 'balioa')
cache.get('gakoa')

Etxeko lan gisa, hobetu inplementazioa klase baten instantzia bat sortzean helbidea/ataka bat zehazteko gaitasuna gehituz.

Orain idatz dezagun zerbitzaria bera.
Oraingo honetan REP (REPly, response) socketa erabiltzen da - eskaeraren zain gaude, erantzun bat bidaltzen. Eskaera analizatzen dugu eta 'ok' erantzuten dugu idazketaren kasuan, edo datuekin / None in the case of reading.

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

Dena elkarrekin probatzeko, zerbitzaria abiarazten dugu komandoarekin
python daemon.py

Hurrengo fitxan, abiarazi python modu interaktiboan.

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

Miraria, funtzionatzen du! Orain seguru idatz dezakezu zure curriculumean "gako-balioen biltegiratzea zmq protokoloa erabiliz"

Iturria: www.habr.com

Gehitu iruzkin berria