Асосҳои кор бо zmq дар python, эҷоди як мағозаи оддии калид/арзиш

Муқаддима

Биёед мисоли калиди оддӣ/нигоҳдории арзишро бубинем, ба монанди memcache. Он оддӣ тарҳрезӣ шудааст - маълумот дар хотира, дар сохтори hasshmap нигоҳ дошта мешавад. Ба онҳо тавассути васлаки tcp дастрасӣ пайдо мекунанд. Дар Python, hasshmap як дикти муқаррарӣ аст. Барои дастрасӣ мо 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'
Истифода кунед

кэш = SuperCacher ()
cache.set('калид', 'арзиш')
cache.get('калид')

Ҳамчун вазифаи хонагӣ, татбиқро тавассути илова кардани қобилияти муайян кардани суроға/порт ҳангоми сохтани як мисоли синф такмил диҳед.

Акнун биёед худи серверро нависем.
Ин дафъа розеткаи REP (REPly, ҷавоб) истифода мешавад - мо интизори дархост, фиристодани посух ҳастем. Мо дархостро таҳлил мекунем ва дар ҳолати навиштан ё бо '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

Дар ҷадвали навбатӣ, python -ро дар реҷаи интерактивӣ оғоз кунед.

>>> from lib import SuperCacher
>>> cache=SuperCacher()
>>> cache.set('key', 'value')
True
>>> cache.get('key')
'value'

Оҳ, мӯъҷиза, он кор мекунад! Акнун шумо метавонед ба таври бехатар дар резюмеи худ "таҳияи нигоҳдории арзишҳои калидӣ бо истифода аз протоколи zmq" нависед

Манбаъ: will.com

Илова Эзоҳ