рдкрд╛рдпрдердирдордзреНрдпреЗ zmq рд╕рд╣ рдХрд╛рдо рдХрд░рдгреНрдпрд╛рдЪреА рдореВрд▓рднреВрдд рдорд╛рд╣рд┐рддреА, рдПрдХ рд╕рд╛рдзреА рдХреА/рд╡реНрд╣реЕрд▓реНрдпреВ рд╕реНрдЯреЛрдЕрд░ рддрдпрд╛рд░ рдХрд░рдгреЗ

рдкрд░рд┐рдЪрдп

рд╕рд╛рдзреНрдпрд╛ рдХреА/рд╡реНрд╣реЕрд▓реНрдпреВ рд╕реНрдЯреЛрд░реЗрдЬрдЪреЗ рдЙрджрд╛рд╣рд░рдг рдкрд╛рд╣реВ, рдЬрд╕реЗ рдХреА memcache. рд╣реЗ рдлрдХреНрдд рдбрд┐рдЭрд╛рдЗрди рдХреЗрд▓реЗ рдЖрд╣реЗ - рдбреЗрдЯрд╛ рдореЗрдорд░реАрдордзреНрдпреЗ, рд╣реЕрд╢рдореЕрдк рд╕реНрдЯреНрд░рдХреНрдЪрд░рдордзреНрдпреЗ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХреЗрд▓рд╛ рдЬрд╛рддреЛ. рддреЗ рдЯреАрд╕реАрдкреА рд╕реЙрдХреЗрдЯрджреНрд╡рд╛рд░реЗ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛рдд. рдкрд╛рдпрдердирдордзреНрдпреЗ, рд╣реЕрд╢рдореЕрдк рд╣рд╛ рдирд┐рдпрдорд┐рдд рд╢рдмреНрдж рдЖрд╣реЗ. рдкреНрд░рд╡реЗрд╢рд╛рд╕рд╛рдареА рдЖрдореНрд╣реА zeromq рд╡рд╛рдкрд░реВ.

рд╕рдорд╛рдпреЛрдЬрди

рд╣реЗ рдкреЕрдХреЗрдЬ рдбреЗрдмрд┐рдпрди/рдЙрдмрдВрдЯреВрдордзреНрдпреЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдлрдХреНрдд рдХрдиреНрд╕реЛрд▓рдордзреНрдпреЗ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдХрд░рд╛
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.set('рдХреА', 'рдореВрд▓реНрдп')
cache.get('рдХреА')

рдЧреГрд╣рдкрд╛рда рдореНрд╣рдгреВрди, рд╡рд░реНрдЧрд╛рдЪреЗ рдЙрджрд╛рд╣рд░рдг рддрдпрд╛рд░ рдХрд░рддрд╛рдирд╛ рдкрддреНрддрд╛/рдкреЛрд░реНрдЯ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдгреНрдпрд╛рдЪреА рдХреНрд╖рдорддрд╛ рдЬреЛрдбреВрди рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рд╕реБрдзрд╛рд░рд╛.

рдЖрддрд╛ рд╕рд░реНрд╡реНрд╣рд░рдЪ рд▓рд┐рд╣реВ.
рдпрд╛рд╡реЗрд│реА рд╕реЙрдХреЗрдЯ REP(REPly, response) рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рддреЛ - рдЖрдореНрд╣реА рд╡рд┐рдирдВрддреАрдЪреА рд╡рд╛рдЯ рдкрд╛рд╣рдд рдЖрд╣реЛрдд, рдкреНрд░рддрд┐рд╕рд╛рдж рдкрд╛рдард╡рдд рдЖрд╣реЛрдд. рдЖрдореНрд╣реА рд╡рд┐рдирдВрддреАрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЛ рдЖрдгрд┐ рд▓реЗрдЦрдирд╛рдЪреНрдпрд╛ рдмрд╛рдмрддреАрдд 'рдареАрдХ рдЖрд╣реЗ' рдХрд┐рдВрд╡рд╛ рдбреЗрдЯрд╛рд╕рд╣ / рд╡рд╛рдЪрдирд╛рдЪреНрдпрд╛ рдмрд╛рдмрддреАрдд рдХрд╛рд╣реАрд╣реА рдирд╛рд╣реА.

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛