Պայմաններ հետ աշխատանքի zmq-ում Python-ում, պարզ key/value պահեստի ստեղծում

Ներածություն

Նայենք պարզ key/value պահեստավորման օրինակ, օրինակ՝ memcache: այն շատ պարզ է. տվյալները պահվում են հիշողության մեջ, hashmap կառուցվածքի մեջ։ Մուտքը կատարվում է tcp-սոխթրի միջոցով։ Python-ով hashmap-ը սովորական dict է։ Մուտք գործելու համար इस्तेमालելու ենք zeromq:

Հավելված

Այս փաթեթը Debian/Ubuntu-ի վրա տեղադրելու համար պարզապես գրել անհրաժեշտ են կոնսոլում
sudo apt-get install libzmq-dev
sudo pip install zmq

Կոդ

Գրելու ենք կլաս սփյուրհների հետ աշխատանքի համար սերվեր:
Օգտագործվող zmq-սոխթրի տեսակը ՝ REQ(REQuest, հարցում), ուղարկում ենք հարցում՝ սպասում պատասխանին:
Տվյալների ցանկացած տեսակը պահելու և փոխանցելու համար օգտագործում ենք ստանդարտ pickle մոդուլը: «Կողմնակի» աշխատանքը՝ երեք արժեքից բաղկացած կործետ` (հրաման, բանալին, տվյալներ)

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'
Օգտագործումը

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

Տան աշխատանքը՝ բարելավել իրականացումը, ավելացնելով հասցե/պորտ նշելու հնարավորություն՝ դասի օրինակ ստեղծելիս:

Այժմ գրենք ինքն։ սերվեր.
Այս անգամ օգտագործվում է REP(REPly, պատասխան) սոխթրը՝ սպասում ենք հարցման, ուղարկում պատասխան։ Դիտում ենք հարցումը, պատասխանում ենք կամ 'ok' գրառնելով, կամ տվյալներով / None՝ կարդալիս:

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

Ամբողջական թեստավորման համար, ծրագրում ենք սերվերը
python daemon.py

Հարևան вкладка-ում запускаем python интерактивном режиме:

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

Օ, հրաշք, դա աշխատում է: Այժմ կարող եք վստահաբար գրել ձեր ռեզյումեում «key-value պահեստավորման մշակման համար zmq պրոտոկոլի օգտագործում»

Ընտանիք: habr.com

Գնել հուսալի հյուրընկալում DDoS պաշտպանությամբ, VPS VDS սերվերներով 🔥 Գնել հուսալի հյուրընկալում DDoS պաշտպանությամբ, VPS VDS սերվերներով | ProHoster