Grunnatriði þess að vinna með zmq í python, búa til einfalda lykil-/gildaverslun

Inngangur

Við skulum skoða dæmi um einfalda lykla/gildi geymslu, eins og minnisminni. Það er hannað einfaldlega - gögnin eru geymd í minni, í hashmap uppbyggingu. Þeir eru aðgengilegir í gegnum tcp-innstungu. Í Python er hashmap venjulegur dict. Fyrir aðgang munum við nota zeromq.

aðlögun

Til að setja þennan pakka upp í debian/ubuntu, sláðu bara inn í stjórnborðið
sudo apt-get install libzmq-dev
sudo pip install zmq

Code

Við skulum skrifa bekk til að vinna með þjóninum okkar:
Tegundin af zmq fals sem notuð er er REQ(REQuest, beiðni), við sendum beiðni og bíðum eftir svari.
Til að geyma og senda hvers kyns gögn yfir netið notum við staðlaða súrum gúrkueininguna. Verkið „samskiptareglur“ er samsetning þriggja gilda: (skipun, lykill, gögn)

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

skyndiminni = SuperCacher()
cache.set('lykill', 'gildi')
cache.get('lykill')

Sem heimanám skaltu bæta útfærsluna með því að bæta við möguleikanum á að tilgreina heimilisfang/gátt þegar þú býrð til tilvik af bekknum.

Nú skulum við skrifa þjóninn sjálfan.
Að þessu sinni er falsið REP(REPly, svar) notað - við bíðum eftir beiðninni, sendum svar. Við greinum beiðnina og svörum annað hvort með „í lagi“ ef um er að ræða skrif, eða með gögnum / Engin ef um lestur er að ræða.

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

Til að prófa allt saman byrjum við þjóninn með skipuninni
python daemon.py

Í næsta flipa skaltu ræsa Python í gagnvirkum ham.

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

Ó kraftaverk, það virkar! Nú geturðu örugglega skrifað í ferilskrána þína „þróun á lykilgildi geymslu með zmq samskiptareglum“

Heimild: www.habr.com

Bæta við athugasemd