рдкрд╛рдпрдерди рдореЗрдВ zmq рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ, рдПрдХ рд╕рд░рд▓ рдХреБрдВрдЬреА/рдореВрд▓реНрдп рд╕реНрдЯреЛрд░ рдмрдирд╛рдирд╛

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

рдЖрдЗрдП рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХреБрдВрдЬреА/рдореВрд▓реНрдп рднрдВрдбрд╛рд░рдг рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ, рдЬреИрд╕реЗ рдХрд┐ рдореЗрдореНрдХреИрд╢ред рдЗрд╕реЗ рд╕рд░рд▓рддрд╛ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдбреЗрдЯрд╛ рдХреЛ рд╣реИрд╢рдореИрдк рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдореЗрдореЛрд░реА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрди рддрдХ рдЯреАрд╕реАрдкреА рд╕реЙрдХреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╣реБрдВрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкрд╛рдпрдерди рдореЗрдВ, рд╣реИрд╢рдореИрдк рдПрдХ рдирд┐рдпрдорд┐рдд рдирд┐рд░реНрджреЗрд╢ рд╣реИред рдПрдХреНрд╕реЗрд╕ рдХреЗ рд▓рд┐рдП рд╣рдо рдЬрд╝реАрд░реЛрдПрдордХреНрдпреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

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

рдЗрд╕ рдкреИрдХреЗрдЬ рдХреЛ рдбреЗрдмрд┐рдпрди/рдЙрдмрдВрдЯреВ рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░реЗрдВ
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'
рдЙрдкрдпреЛрдЧ

рдХреИрд╢ = рд╕реБрдкрд░рдХреИрдЪрд░()
рдХреИрд╢.рд╕реЗрдЯ('рдХреБрдВрдЬреА', 'рдорд╛рди')
рдХреИрд╢.рдЧреЗрдЯ('рдХреБрдВрдЬреА')

рд╣реЛрдорд╡рд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ, рдХрдХреНрд╖рд╛ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╕рдордп рдкрддрд╛/рдкреЛрд░реНрдЯ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рдХрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░реЗрдВред

рдЕрдм рд╕рд░реНрд╡рд░ рдХреЛ рд╣реА рд▓рд┐рдЦрддреЗ рд╣реИрдВред
рдЗрд╕ рдмрд╛рд░ рд╕реЙрдХреЗрдЯ рдЖрд░рдИрдкреА (рд░рд┐рдкреНрд▓рд╛рдИ, рд░рд┐рд╕реНрдкрд╛рдВрд╕) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╣рдо рдЕрдиреБрд░реЛрдз рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рднреЗрдЬ рд░рд╣реЗ рд╣реИрдВред рд╣рдо рдЕрдиреБрд░реЛрдз рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╛ рддреЛ 'рдареАрдХ' рдХреЗ рд╕рд╛рде, рдпрд╛ рдкрдврд╝рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдбреЗрдЯрд╛/рдХреЛрдИ рдирд╣реАрдВ рдХреЗ рд╕рд╛рде рдЬрд╡рд╛рдм рджреЗрддреЗ рд╣реИрдВред

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ