Misingi ya kufanya kazi na zmq kwenye python, kuunda ufunguo rahisi / duka la thamani

Utangulizi

Hebu tuangalie mfano wa uhifadhi rahisi wa ufunguo/thamani, kama vile memcache. Imeundwa kwa urahisi - data imehifadhiwa kwenye kumbukumbu, katika muundo wa hashmap. Zinapatikana kupitia tundu la tcp. Katika Python, hashmap ni amri ya kawaida. Kwa ufikiaji tutatumia zeromq.

marekebisho

Ili kusakinisha kifurushi hiki kwenye debian/ubuntu, ingiza tu kwenye koni
sudo apt-get install libzmq-dev
sudo pip install zmq

Kanuni

Wacha tuandike darasa la kufanya kazi na seva yetu:
Aina ya soketi ya zmq inayotumika ni REQ(REQuest, request), tunatuma ombi na kusubiri jibu.
Ili kuhifadhi na kusambaza aina yoyote ya data kwenye mtandao, tunatumia moduli ya kawaida ya kachumbari. "Itifaki" ya kazi ni nakala ya maadili matatu: (amri, ufunguo, data)

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'
Matumizi ya

kache = SuperCacher ()
cache.set('ufunguo', 'thamani')
cache.get('ufunguo')

Kama kazi ya nyumbani, boresha utekelezaji kwa kuongeza uwezo wa kubainisha anwani/mlango unapounda mfano wa darasa.

Sasa hebu tuandike seva yenyewe.
Wakati huu tundu REP(REPly, response) inatumika - tunasubiri ombi, kutuma jibu. Tunachanganua ombi na kujibu ama kwa 'sawa' katika kesi ya kuandika, au kwa data / Hakuna katika kesi ya kusoma.

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

Ili kujaribu kila kitu pamoja, tunaanza seva na amri
python daemon.py

Kwenye kichupo kinachofuata, uzindua python katika hali ya maingiliano.

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

Ah muujiza, inafanya kazi! Sasa unaweza kuandika katika wasifu wako kwa usalama "maendeleo ya hifadhi ya thamani-msingi kwa kutumia itifaki ya zmq"

Chanzo: mapenzi.com

Kuongeza maoni