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

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

рдЖрдЗрдП рдПрдХ рд╕рд░рд▓ рдХреБрдВрдЬреА/рдореВрд▓реНрдп рд╕рдВрдЧреНрд░рд╣рдг рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ, рдЬреИрд╕реЗ рдХрд┐ рдореЗрдордХреИрдЪред рдпрд╣ рд╕рд░рд▓ рд╣реИ - рдбреЗрдЯрд╛ рдореЗрдореЛрд░реА рдореЗрдВ, рд╣реИрд╢рдореИрдк рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрди рддрдХ рдкрд╣реБрдБрдЪ рдПрдХ tcp рд╕реЙрдХреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реЛрддреА рд╣реИред рдкрд╛рдпрдерди рдореЗрдВ, рд╣реИрд╢рдореИрдк рдПрдХ рдирд┐рдпрдорд┐рдд рдбрд┐рдХреНрдЯ рд╣реИред рд╣рдо рдкрд╣реБрдБрдЪ рдХреЗ рд▓рд┐рдП 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'
рдЙрдкрдпреЛрдЧ

рдХреИрд╢ = рд╕реБрдкрд░рдХреИрдЪрд░()
рдХреИрд╢.рд╕реЗрдЯ('рдХреБрдВрдЬреА', 'рдореВрд▓реНрдп')
рдХреИрд╢.get('рдХреБрдВрдЬреА')

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

рдЕрдм рд╣рдо рдЗрд╕реЗ рдЦреБрдж рд▓рд┐рдЦреЗрдВрдЧреЗред рд╕реЗрд╡рдХ.
рдЗрд╕ рдмрд╛рд░, REP(REPly, response) рд╕реЙрдХреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╣рдо рдЕрдиреБрд░реЛрдз рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рднреЗрдЬрддреЗ рд╣реИрдВред рд╣рдо рдЕрдиреБрд░реЛрдз рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╣реИрдВ, рд▓рд┐рдЦрдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ 'ok' рдХреЗ рд╕рд╛рде рдпрд╛ рдкрдврд╝рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ data / None рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрддреЗ рд╣реИрдВред

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

DDoS рд╕реБрд░рдХреНрд╖рд╛, VPS VDS рд╕рд░реНрд╡рд░ рд╡рд╛рд▓реА рд╕рд╛рдЗрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдЦрд░реАрджреЗрдВ ЁЯФе рдбреАрдбреАрдУрдПрд╕ рд╕реБрд░рдХреНрд╖рд╛, рд╡реАрдкреАрдПрд╕ рдФрд░ рд╡реАрдбреАрдПрд╕ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдЦрд░реАрджреЗрдВ | ProHoster