Основы Работы С Zmq В Python, Создание Простого Хранилища Ключей/Значений



Введение Давайте рассмотрим пример простого хранилища ключей/значений, такого как memcache. Устроен он просто — данные хранятся в памяти, в структуре хэш-карты.

Доступ к ним осуществляется через TCP-сокет. В Python хэш-карта — это обычный словарь.

Для доступа мы будем использовать нулевой mq.



Настройки

Чтобы установить этот пакет в Debian/Ubuntu, просто введите в консоли
  
  
   

sudo apt-get install libzmq-dev



sudo pip install zmq



Код

Напишем класс для работы с нашим сервером: Тип используемого сокета zmq — REQ(REQuest, request), отправляем запрос и ждем ответа.

Для хранения и передачи любых типов данных по сети мы используем стандартный модуль Pickle. Рабочий «протокол» представляет собой кортеж из трёх значений: (команда, ключ, данные)

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'



Применение
кэш = СуперКэшер() кэш.

set('ключ', 'значение') кэш.

get('ключ') В качестве домашнего задания улучшите реализацию, добавив возможность указывать адрес/порт при создании экземпляра класса.

Теперь напишем сам сервер.

На этот раз используется сокет REP(REPly,response) — ждем запроса, отправляя ответ. Мы разбираем запрос и отвечаем либо «ОК» в случае записи, либо 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

На следующей вкладке запустите Python в интерактивном режиме.



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

О чудо, это работает! Теперь вы можете смело писать в резюме «разработка хранилища «ключ-значение» по протоколу zmq».

Теги: #python #zeromq #zeromq #Чулан

Вместе с данным постом часто просматривают: