āĻĒāĻžāĻ‡āĻĨāĻ¨ā§‡ zmq āĻāĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻžāĻ° āĻŽā§ŒāĻ˛āĻŋāĻ• āĻŦāĻŋāĻˇāĻ¯āĻŧ, āĻāĻ•āĻŸāĻŋ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻ•ā§€/āĻŽāĻžāĻ¨ āĻ¸ā§āĻŸā§‹āĻ° āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž

āĻ­ā§‚āĻŽāĻŋāĻ•āĻž

āĻ†āĻ¸ā§āĻ¨ āĻāĻ•āĻŸāĻŋ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻ•ā§€/āĻŽāĻžāĻ¨ āĻ¸āĻžā§āĻšāĻ¯āĻŧā§‡āĻ° āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻĻā§‡āĻ–āĻŋ, āĻ¯ā§‡āĻŽāĻ¨ āĻŽā§‡āĻŽāĻ•ā§āĻ¯āĻžāĻļāĨ¤ āĻāĻŸāĻŋ āĻ¸āĻšāĻœāĻ­āĻžāĻŦā§‡ āĻĄāĻŋāĻœāĻžāĻ‡āĻ¨ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡ - āĻĄā§‡āĻŸāĻž āĻŽā§‡āĻŽāĻ°āĻŋāĻ¤ā§‡, āĻšā§āĻ¯āĻžāĻļāĻŽā§āĻ¯āĻžāĻĒ āĻ•āĻžāĻ āĻžāĻŽā§‹āĻ¤ā§‡ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ āĻāĻ—ā§āĻ˛āĻŋ āĻŸāĻŋāĻ¸āĻŋāĻĒāĻŋ āĻ¸āĻ•ā§‡āĻŸā§‡āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ āĻĒāĻžāĻ‡āĻĨāĻ¨ā§‡, āĻšā§āĻ¯āĻžāĻļāĻŽā§āĻ¯āĻžāĻĒ āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ¯āĻŧāĻŽāĻŋāĻ¤ āĻĄāĻŋāĻ•ā§āĻŸāĨ¤ āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ†āĻŽāĻ°āĻž zeromq āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŦāĨ¤

āĻ¸āĻŽāĻ¨ā§āĻŦāĻ¯āĻŧ

āĻĄā§‡āĻŦāĻŋāĻ¯āĻŧāĻžāĻ¨/āĻ‰āĻŦā§āĻ¨ā§āĻŸā§āĻ¤ā§‡ āĻāĻ‡ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻœāĻŸāĻŋ āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°āĻ¤ā§‡, āĻļā§āĻ§ā§ āĻ•āĻ¨āĻ¸ā§‹āĻ˛ā§‡ āĻĒā§āĻ°āĻŦā§‡āĻļ āĻ•āĻ°ā§āĻ¨
sudo apt-get install libzmq-dev
sudo pip install zmq

āĻ•ā§‹āĻĄ

āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ•ā§āĻ˛āĻžāĻ¸ āĻ˛āĻŋāĻ–ā§āĻ¨:
āĻŦā§āĻ¯āĻŦāĻšā§ƒāĻ¤ zmq āĻ¸āĻ•ā§‡āĻŸā§‡āĻ° āĻ§āĻ°āĻ¨ āĻšāĻ˛ REQ (āĻ…āĻ¨ā§āĻ°ā§‹āĻ§, āĻ…āĻ¨ā§āĻ°ā§‹āĻ§), āĻ†āĻŽāĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻĒāĻžāĻ āĻžāĻ‡ āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻŋāĨ¤
āĻ¨ā§‡āĻŸāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ•ā§‡ āĻ¯ā§‡āĻ•ā§‹āĻ¨ā§‹ āĻ§āĻ°āĻ¨ā§‡āĻ° āĻĄā§‡āĻŸāĻž āĻ¸āĻžā§āĻšāĻ¯āĻŧ āĻ“ āĻĒā§āĻ°ā§‡āĻ°āĻŖ āĻ•āĻ°āĻ¤ā§‡, āĻ†āĻŽāĻ°āĻž āĻ¸ā§āĻŸā§āĻ¯āĻžāĻ¨ā§āĻĄāĻžāĻ°ā§āĻĄ āĻĒāĻŋāĻ•āĻ˛ āĻŽāĻĄāĻŋāĻ‰āĻ˛ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŋāĨ¤ āĻ•āĻžāĻœ "āĻĒā§āĻ°āĻŸā§‹āĻ•āĻ˛" āĻ¤āĻŋāĻ¨āĻŸāĻŋ āĻŽāĻžāĻ¨ā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻŸāĻŋāĻĒāĻ˛: (āĻ•āĻŽāĻžāĻ¨ā§āĻĄ, āĻ•ā§€, āĻĄā§‡āĻŸāĻž)

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.set('āĻ•ā§€', 'āĻŽāĻžāĻ¨')
cache.get('āĻ•ā§€')

āĻšā§‹āĻŽāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ• āĻšāĻŋāĻ¸āĻžāĻŦā§‡, āĻāĻ•āĻŸāĻŋ āĻ•ā§āĻ˛āĻžāĻ¸ā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻāĻ•āĻŸāĻŋ āĻ āĻŋāĻ•āĻžāĻ¨āĻž/āĻĒā§‹āĻ°ā§āĻŸ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ•āĻ°āĻžāĻ° āĻ•ā§āĻˇāĻŽāĻ¤āĻž āĻ¯ā§‹āĻ— āĻ•āĻ°ā§‡ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻ‰āĻ¨ā§āĻ¨āĻ¤ āĻ•āĻ°ā§āĻ¨āĨ¤

āĻāĻ–āĻ¨ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻ¨āĻŋāĻœā§‡āĻ‡ āĻ˛āĻŋāĻ–āĻŋāĨ¤
āĻāĻ‡ āĻ¸āĻŽāĻ¯āĻŧ āĻ¸āĻ•ā§‡āĻŸ 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

āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§€ āĻŸā§āĻ¯āĻžāĻŦā§‡, āĻ‡āĻ¨ā§āĻŸāĻžāĻ°ā§‡āĻ•ā§āĻŸāĻŋāĻ­ āĻŽā§‹āĻĄā§‡ āĻĒāĻžāĻ‡āĻĨāĻ¨ āĻšāĻžāĻ˛ā§ āĻ•āĻ°ā§āĻ¨āĨ¤

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

āĻ“āĻš āĻ…āĻ˛ā§ŒāĻ•āĻŋāĻ•, āĻāĻŸāĻž āĻ•āĻžāĻœ āĻ•āĻ°ā§‡! āĻāĻ–āĻ¨ āĻ†āĻĒāĻ¨āĻŋ āĻ¨āĻŋāĻ°āĻžāĻĒāĻĻā§‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻœā§€āĻŦāĻ¨āĻŦā§ƒāĻ¤ā§āĻ¤āĻžāĻ¨ā§āĻ¤ā§‡ āĻ˛āĻŋāĻ–āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ "zmq āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ•ā§€-āĻ­ā§āĻ¯āĻžāĻ˛ā§ āĻ¸ā§āĻŸā§‹āĻ°ā§‡āĻœā§‡āĻ° āĻŦāĻŋāĻ•āĻžāĻļ"

āĻ‰āĻ¤ā§āĻ¸: www.habr.com

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨