ื™ืกื•ื“ื•ืช ื”ืขื‘ื•ื“ื” ืขื zmq ื‘-python, ื™ืฆื™ืจืช ื—ื ื•ืช ืžืคืชื—/ืขืจืš ืคืฉื•ื˜ื”

ืžื‘ื•ื

ื‘ื•ืื• ื ืกืชื›ืœ ืขืœ ื“ื•ื’ืžื” ืœืื—ืกื•ืŸ ืžืคืชื—/ืขืจืš ืคืฉื•ื˜, ื›ื’ื•ืŸ memcache. ื”ื•ื ืžืชื•ื›ื ืŸ ื‘ืคืฉื˜ื•ืช - ื”ื ืชื•ื ื™ื ืžืื•ื—ืกื ื™ื ื‘ื–ื™ื›ืจื•ืŸ, ื‘ืžื‘ื ื” hashmap. ื”ื’ื™ืฉื” ืืœื™ื”ื ืžืชื‘ืฆืขืช ื‘ืืžืฆืขื•ืช ืฉืงืข tcp. ื‘-Python, hashmap ื”ื•ื dict ืจื’ื™ืœ. ืœื’ื™ืฉื” ื ืฉืชืžืฉ ื‘- zeromq.

ื”ืชืืžื”

ื›ื“ื™ ืœื”ืชืงื™ืŸ ื—ื‘ื™ืœื” ื–ื• ื‘-debian/ubuntu, ืคืฉื•ื˜ ื”ื™ื›ื ืก ืœืงื•ื ืกื•ืœื”
sudo apt-get install libzmq-dev
sudo pip install zmq

ืงื•ื“

ื‘ื•ืื• ื ื›ืชื•ื‘ ืžื—ืœืงื” ืœืขื‘ื•ื“ื” ืขื ื”ืฉืจืช ืฉืœื ื•:
ืกื•ื’ ืฉืงืข zmq ื”ืžืฉืžืฉ ื”ื•ื REQ(REQuest, request), ืื ื• ืฉื•ืœื—ื™ื ื‘ืงืฉื” ื•ืžื—ื›ื™ื ืœืชื’ื•ื‘ื”.
ื›ื“ื™ ืœืื—ืกืŸ ื•ืœื”ืขื‘ื™ืจ ื›ืœ ืกื•ื’ ืฉืœ ื ืชื•ื ื™ื ื“ืจืš ื”ืจืฉืช, ืื ื• ืžืฉืชืžืฉื™ื ื‘ืžื•ื“ื•ืœ ื”ื—ืžื•ืฆื™ื ื”ืกื˜ื ื“ืจื˜ื™. "ืคืจื•ื˜ื•ืงื•ืœ" ื”ืขื‘ื•ื“ื” ื”ื•ื ืงื•ืžืคืœื” ืฉืœ ืฉืœื•ืฉื” ืขืจื›ื™ื: (ืคืงื•ื“ื”, ืžืคืชื—, ื ืชื•ื ื™ื)

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, ืชื’ื•ื‘ื”) - ืื ื• ืžืžืชื™ื ื™ื ืœื‘ืงืฉื”, ืฉื•ืœื—ื™ื ืชื’ื•ื‘ื”. ืื ื• ืžื ืชื—ื™ื ืืช ื”ื‘ืงืฉื” ื•ืžื’ื™ื‘ื™ื ืื• ื‘'ืื™ืฉื•ืจ' ื‘ืžืงืจื” ืฉืœ ื›ืชื™ื‘ื”, ืื• ืขื ื ืชื•ื ื™ื / ืื™ืŸ ื‘ืžืงืจื” ืฉืœ ืงืจื™ืื”.

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'

ื”ื• ื ืก, ื–ื” ืขื•ื‘ื“! ืขื›ืฉื™ื• ืืชื” ื™ื›ื•ืœ ืœื›ืชื•ื‘ ื‘ื‘ื˜ื—ื” ื‘ืงื•ืจื•ืช ื”ื—ื™ื™ื ืฉืœืš "ืคื™ืชื•ื— ืฉืœ ืื—ืกื•ืŸ ืขืจืš ืžืคืชื— ื‘ืืžืฆืขื•ืช ืคืจื•ื˜ื•ืงื•ืœ zmq"

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”