เดชเตˆเดคเตเดคเดฃเดฟเตฝ zmq เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดฑเต† เด…เดŸเดฟเดธเตเดฅเดพเดจเด™เตเด™เตพ, เด’เดฐเต เดฒเดณเดฟเดคเดฎเดพเดฏ เด•เต€/เดฎเต‚เดฒเตเดฏเด‚ เดธเตเดฑเตเดฑเต‹เตผ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเต

เด†เดฎเตเด–เด‚

เดฎเต†เด‚เด•เดพเดทเต† เดชเต‹เดฒเต†เดฏเตเดณเตเดณ เด’เดฐเต เดฒเดณเดฟเดคเดฎเดพเดฏ เด•เต€/เดฎเต‚เดฒเตเดฏ เดธเด‚เดญเดฐเดฃเดคเตเดคเดฟเดจเตเดฑเต† เด’เดฐเต เด‰เดฆเดพเดนเดฐเดฃเด‚ เดจเต‹เด•เตเด•เดพเด‚. เด‡เดคเต เดฒเดณเดฟเดคเดฎเดพเดฏเดฟ เดฐเต‚เดชเด•เตฝเดชเตเดชเดจ เดšเต†เดฏเตโ€Œเดคเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต - เดกเดพเดฑเตเดฑ เดฎเต†เดฎเตเดฎเดฑเดฟเดฏเดฟเตฝ, เด’เดฐเต เดนเดพเดทเตโ€Œเดฎเดพเดชเตเดชเต เด˜เดŸเดจเดฏเดฟเตฝ เดธเด‚เดญเดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต. เด’เดฐเต เดŸเดฟเดธเดฟเดชเดฟ เดธเต‹เด•เตเด•เดฑเตเดฑเต เดตเดดเดฟเดฏเดพเดฃเต เด…เดต เด†เด•เตเดธเดธเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเต. เดชเตˆเดคเตเดคเดฃเดฟเตฝ, เดนเดพเดทเตเดฎเดพเดชเตเดชเต เด’เดฐเต เดธเตเดฅเดฟเดฐเด‚ เด†เด–เตเดฏเดพเดจเดฎเดพเดฃเต. เดชเตเดฐเดตเต‡เดถเดจเดคเตเดคเดฟเดจเดพเดฏเดฟ เดžเด™เตเด™เตพ zeromq เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด‚.

เด•เดฎเดชเตเดชเต†เดŸเตเดคเตเดคเดฒเต

เดˆ เดชเดพเด•เตเด•เต‡เดœเต เดกเต†เดฌเดฟเดฏเตป/เด‰เดฌเตเดฃเตเดŸเตเดตเดฟเตฝ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเดพเตป, เด•เตบเดธเต‹เดณเดฟเตฝ เดจเตฝเด•เตเด•
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'
เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด•

เด•เดพเดทเต† = SuperCacher()
cache.set('เด•เต€', 'เดฎเต‚เดฒเตเดฏเด‚')
cache.get('เด•เต€')

เด—เตƒเดนเดชเดพเด เดฎเต†เดจเตเดจ เดจเดฟเดฒเดฏเดฟเตฝ, เด’เดฐเต เด•เตเดฒเดพเดธเดฟเดจเตเดฑเต† เด’เดฐเต เด‰เดฆเดพเดนเดฐเดฃเด‚ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เด’เดฐเต เดตเดฟเดฒเดพเดธเด‚/เดชเต‹เตผเดŸเตเดŸเต เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เดพเดจเตเดณเตเดณ เด•เดดเดฟเดตเต เดšเต‡เตผเดคเตเดคเต เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตฝ เดฎเต†เดšเตเดšเดชเตเดชเต†เดŸเตเดคเตเดคเตเด•.

เด‡เดจเดฟ เดจเดฎเตเด•เตเด•เต เดธเต†เตผเดตเตผ เดคเดจเตเดจเต† เดŽเดดเตเดคเดพเด‚.
เดˆ เดธเดฎเดฏเด‚ เดธเต‹เด•เตเด•เดฑเตเดฑเต REP (REPly, เดชเตเดฐเดคเดฟเด•เดฐเดฃเด‚) เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต - เดžเด™เตเด™เตพ เด…เดญเตเดฏเตผเดคเตเดฅเดจเดฏเตเด•เตเด•เดพเดฏเดฟ เด•เดพเดคเตเดคเดฟเดฐเดฟเด•เตเด•เตเด•เดฏเดพเดฃเต, เด’เดฐเต เดชเตเดฐเดคเดฟเด•เดฐเดฃเด‚ เด…เดฏเดฏเตเด•เตเด•เตเดจเตเดจเต. เดžเด™เตเด™เตพ เด…เดญเตเดฏเตผเดคเตเดฅเดจ เดชเดพเดดเตโ€Œเดธเต เดšเต†เดฏเตโ€Œเดคเต เดŽเดดเตเดคเตเดจเตเดจ เด•เดพเดฐเตเดฏเดคเตเดคเดฟเตฝ 'เดถเดฐเดฟ' เดŽเดจเตเดจเต‹ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดตเดพเดฏเดฟเด•เตเด•เตเดจเตเดจ เด•เดพเดฐเตเดฏเดคเตเดคเดฟเตฝ เดกเดพเดฑเตเดฑ / เด’เดจเตเดจเตเดฎเดฟเดฒเตเดฒ เดŽเดจเตเดจเต‹ เดฎเดฑเตเดชเดŸเดฟ เดจเตฝเด•เตเด‚.

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

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•