เชชเชพเชฏเชฅเซ‹เชจเชฎเชพเช‚ zmq เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพเชจเซ€ เชฎเซ‚เชณเชญเซ‚เชค เชฌเชพเชฌเชคเซ‹, เชเช• เชธเชฐเชณ เช•เซ€/เชตเซ‡เชฒเซเชฏเซ เชธเซเชŸเซ‹เชฐ เชฌเชจเชพเชตเซ€เชจเซ‡

เชชเชฐเชฟเชšเชฏ

เชšเชพเชฒเซ‹ เชเช• เชธเชฐเชณ เช•เซ€/เชตเซ‡เชฒเซเชฏเซ เชธเซเชŸเซ‹เชฐเซ‡เชœเชจเซเช‚ เช‰เชฆเชพเชนเชฐเชฃ เชœเซ‹เชˆเช, เชœเซ‡เชฎ เช•เซ‡ เชฎเซ‡เชฎเช•เซ‡เชถ. เชคเซ‡ เชธเชฐเชณ เชฐเซ€เชคเซ‡ เชกเชฟเชเชพเช‡เชจ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เช›เซ‡ - เชกเซ‡เชŸเชพ เชนเซ‡เชถเชฎเซ‡เชช เชธเซเชŸเซเชฐเช•เซเชšเชฐเชฎเชพเช‚ เชฎเซ‡เชฎเชฐเซ€เชฎเชพเช‚ เชธเช‚เช—เซเชฐเชนเชฟเชค เชฅเชพเชฏ เช›เซ‡. เชคเซ‡เช“เชจเซ‡ tcp เชธเซ‹เช•เซ‡เชŸ เชฆเซเชตเชพเชฐเชพ เชเช•เซเชธเซ‡เชธ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชชเชพเชฏเชฅเซ‹เชจเชฎเชพเช‚, เชนเซ‡เชถเชฎเซ‡เชช เช เชจเชฟเชฏเชฎเชฟเชค เชกเชฟเช•เซเชŸ เช›เซ‡. เชเช•เซเชธเซ‡เชธ เชฎเชพเชŸเซ‡ เช†เชชเชฃเซ‡ 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'
เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹

cache = เชธเซเชชเชฐเช•เซ‡เชšเชฐ()
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

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹