Pamati darbam ar zmq programmā python, vienkārša atslēgu/vērtību krātuves izveide

Ievads

Apskatīsim vienkāršas atslēgas/vērtības krātuves piemēru, piemēram, memcache. Tas ir izveidots vienkārši - dati tiek glabāti atmiņā, hashmap struktūrā. Tiem var piekļūt, izmantojot tcp ligzdu. Python valodā hashmap ir parasts diktāts. Piekļuvei izmantosim zeromq.

koriģēšana

Lai instalētu šo pakotni debian/ubuntu, vienkārši ievadiet konsolē
sudo apt-get install libzmq-dev
sudo pip install zmq

Kods

Uzrakstīsim klasi darbam ar mūsu serveri:
Izmantotais zmq ligzdas veids ir REQ(REQuest, request), mēs nosūtām pieprasījumu un gaidām atbildi.
Lai saglabātu un pārsūtītu jebkāda veida datus tīklā, mēs izmantojam standarta marinēšanas moduli. Darba "protokols" ir trīs vērtību kopa: (komanda, atslēga, dati)

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

kešatmiņa = SuperCacher()
cache.set('key', 'value')
cache.get('key')

Kā mājasdarbu uzlabojiet ieviešanu, pievienojot iespēju norādīt adresi/portu, veidojot klases gadījumu.

Tagad rakstīsim pašu serveri.
Šoreiz tiek izmantota ligzda REP(REPly, response) - gaidām pieprasījumu, nosūtot atbildi. Mēs parsējam pieprasījumu un atbildam ar “ok” rakstīšanas gadījumā vai ar datiem / Nav lasīšanas gadījumā.

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

Lai pārbaudītu visu kopā, mēs startējam serveri ar komandu
python daemon.py

Nākamajā cilnē palaidiet python interaktīvajā režīmā.

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

Ak, brīnums, tas darbojas! Tagad varat droši rakstīt savā CV "atslēgas vērtību krātuves izstrāde, izmantojot zmq protokolu".

Avots: www.habr.com

Pievieno komentāru