Basis fan wurkjen mei zmq yn python, it meitsjen fan in ienfâldige kaai / wearde winkel

Ynlieding

Litte wy nei in foarbyld sjen fan in ienfâldige kaai / wearde opslach, lykas memcache. It is ienfâldich ûntworpen - de gegevens wurde opslein yn it ûnthâld, yn in hashmapstruktuer. Se wurde tagong fia in tcp-socket. Yn Python is hashmap in gewoane dict. Foar tagong sille wy zeromq brûke.

oanpassing

Om dit pakket yn debian/ubuntu te ynstallearjen, ynfiere jo gewoan yn 'e konsole
sudo apt-get install libzmq-dev
sudo pip install zmq

koade

Litte wy in klasse skriuwe om mei ús server te wurkjen:
It brûkte type zmq-socket is REQ (REQuest, fersyk), wy stjoere in fersyk en wachtsje op in antwurd.
Foar it bewarjen en ferstjoeren fan alle soarten gegevens oer it netwurk, brûke wy de standert pickle-module. It wurk "protokol" is in tuple fan trije wearden: (kommando, kaai, gegevens)

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'
Gebrûk

cache = SuperCacher()
cache.set('key', 'wearde')
cache.get('key')

As húswurk, ferbetterje de ymplemintaasje troch it tafoegjen fan de mooglikheid om in adres / haven oan te jaan by it meitsjen fan in eksimplaar fan in klasse.

Litte wy no de tsjinner sels skriuwe.
Dizze kear wurdt de socket REP (REPly, antwurd) brûkt - wy wachtsje op it fersyk, stjoere in antwurd. Wy parse it fersyk en reagearje of mei 'ok' yn it gefal fan skriuwen, of mei gegevens / Gjin yn it gefal fan lêzen.

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

Om alles tegearre te testen, begjinne wy ​​de tsjinner mei it kommando
python daemon.py

Start python yn 'e folgjende ljepper yn ynteraktive modus.

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

Oh wûnder, it wurket! No kinne jo feilich skriuwe yn jo cv "ûntwikkeling fan opslach fan kaai-wearde mei it zmq-protokol"

Boarne: www.habr.com

Add a comment