рдкрд╛рдЗрдердирдорд╛ zmq рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреЗ рдЖрдзрд╛рд░рднреВрдд рдХреБрд░рд╛рд╣рд░реВ, рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХреБрдЮреНрдЬреА/рдорд╛рди рднрдгреНрдбрд╛рд░ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджреИ

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

рд╕рд╛рдзрд╛рд░рдг рдХреБрдЮреНрдЬреА/рдорд╛рди рднрдгреНрдбрд╛рд░рдгрдХреЛ рдЙрджрд╛рд╣рд░рдг рд╣реЗрд░реМрдВ, рдЬрд╕реНрддреИ рдореЗрдордХреНрдпрд╛рдЪред рдпреЛ рд╕рд░рд▓ рд░реВрдкрдорд╛ рдбрд┐рдЬрд╛рдЗрди рдЧрд░рд┐рдПрдХреЛ рдЫ - рдбреЗрдЯрд╛ рдореЗрдореЛрд░реАрдорд╛ рднрдгреНрдбрд╛рд░ рдЧрд░рд┐рдПрдХреЛ рдЫ, рд╣реНрдпрд╛рд╢рдореНрдпрд╛рдк рд╕рдВрд░рдЪрдирд╛рдорд╛ред рддрд┐рдиреАрд╣рд░реВ рдПрдХ tcp рд╕рдХреЗрдЯ рдорд╛рд░реНрдлрдд рдкрд╣реБрдБрдЪ рдЧрд░рд┐рдиреНрдЫред Python рдорд╛, hashmap рдПрдХ рдирд┐рдпрдорд┐рдд рдбрд┐рдХреНрдЯ рд╣реЛред рдкрд╣реБрдБрдЪрдХреЛ рд▓рд╛рдЧрд┐ рд╣рд╛рдореА zeromq рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреМрдВред

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

рдпреЛ рдкреНрдпрд╛рдХреЗрдЬ debian/ubuntu рдорд╛ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрди, рдХреЗрд╡рд▓ рдХрдиреНрд╕реЛрд▓рдорд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реН
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, 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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди