zmqโ€“แƒ—แƒแƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒก แƒกแƒแƒคแƒฃแƒซแƒ•แƒšแƒ”แƒ‘แƒ˜ แƒžแƒ˜แƒ—แƒแƒœแƒจแƒ˜, แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ˜แƒก/แƒฆแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒฆแƒแƒ–แƒ˜แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ

แƒจแƒ”แƒกแƒแƒ•แƒแƒšแƒ˜

แƒ›แƒแƒ“แƒ˜แƒ— แƒจแƒ”แƒ•แƒฎแƒ”แƒ“แƒแƒ— แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ˜แƒก / แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ˜แƒก แƒจแƒ”แƒœแƒแƒฎแƒ•แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒก, แƒ แƒแƒ’แƒแƒ แƒ˜แƒชแƒแƒ memcache. แƒ˜แƒก แƒ›แƒแƒฌแƒงแƒแƒ‘แƒ˜แƒšแƒ˜แƒ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒแƒ“ - แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒ˜แƒœแƒแƒฎแƒ”แƒ‘แƒ แƒ›แƒ”แƒฎแƒกแƒ˜แƒ”แƒ แƒ”แƒ‘แƒแƒจแƒ˜, แƒฐแƒ”แƒจแƒ›แƒแƒžแƒ˜แƒก แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒแƒจแƒ˜. แƒ›แƒแƒ—แƒ–แƒ” แƒฌแƒ•แƒ“แƒแƒ›แƒ แƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ“แƒ”แƒ‘แƒ tcp แƒกแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒ˜แƒ—. แƒžแƒ˜แƒ—แƒแƒœแƒจแƒ˜ แƒฐแƒแƒจแƒ›แƒแƒžแƒ˜ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ“แƒ˜แƒฅแƒขแƒแƒขแƒ˜แƒ. แƒฌแƒ•แƒ“แƒแƒ›แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— zeromq.

แƒ แƒ”แƒ’แƒฃแƒšแƒ˜แƒ แƒ”แƒ‘แƒ

Debian/ubuntu-แƒจแƒ˜ แƒแƒ› แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ“แƒแƒกแƒแƒงแƒ”แƒœแƒ”แƒ‘แƒšแƒแƒ“, แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ แƒจแƒ”แƒ“แƒ˜แƒ— แƒ™แƒแƒœแƒกแƒแƒšแƒจแƒ˜
sudo apt-get install libzmq-dev
sudo pip install zmq

แƒ™แƒแƒ“แƒ˜

แƒ›แƒแƒ“แƒ˜แƒ— แƒ“แƒแƒ•แƒฌแƒ”แƒ แƒแƒ— แƒ™แƒšแƒแƒกแƒ˜ แƒฉแƒ•แƒ”แƒœแƒก แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ—แƒแƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก:
แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ zmq แƒกแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒขแƒ˜แƒžแƒ˜แƒ REQ(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'
แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ—

แƒฅแƒ”แƒจแƒ˜ = SuperCacher()
cache.set('แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ˜', 'แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ')
cache.get ('แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ˜')

แƒ แƒแƒ’แƒแƒ แƒช แƒกแƒแƒจแƒ˜แƒœแƒแƒ แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ, แƒ’แƒแƒแƒฃแƒ›แƒฏแƒแƒ‘แƒ”แƒกแƒ”แƒ— แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒ แƒ™แƒšแƒแƒกแƒ˜แƒก แƒ˜แƒœแƒกแƒขแƒแƒœแƒชแƒ˜แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒกแƒแƒก แƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒ˜แƒก/แƒžแƒแƒ แƒขแƒ˜แƒก แƒ›แƒ˜แƒ—แƒ˜แƒ—แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒšแƒแƒ‘แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ—.

แƒแƒฎแƒšแƒ แƒ›แƒแƒ“แƒ˜แƒ— แƒ“แƒแƒ•แƒฌแƒ”แƒ แƒแƒ— แƒ—แƒแƒ•แƒแƒ“ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜.
แƒแƒ›แƒฏแƒ”แƒ แƒแƒ“ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ REP(REPly, response) แƒกแƒแƒ™แƒ”แƒขแƒ˜ - แƒ•แƒ”แƒšแƒแƒ“แƒ”แƒ‘แƒ˜แƒ— แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒแƒก, แƒ•แƒฃแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒ— แƒžแƒแƒกแƒฃแƒฎแƒก. แƒฉแƒ•แƒ”แƒœ แƒ•แƒแƒแƒœแƒแƒšแƒ˜แƒ–แƒ”แƒ‘แƒ— แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒแƒก, แƒ•แƒžแƒแƒกแƒฃแƒฎแƒแƒ‘แƒ— แƒแƒœ "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

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ