Noções básicas de trabalho com o zmq em python, criando um armazenamento simples de chave / valor

1. Introdução


Vejamos um exemplo de um armazenamento simples de chave / valor, como o memcache. É simplesmente organizado - os dados são armazenados na memória, na estrutura de hashmap. O acesso a eles é feito através de um soquete TCP. Em python, o hashmap é um ditado regular. Para acessar, usaremos o zeromq.

Personalização


Para instalar este pacote no debian / ubuntu, basta entrar no console
sudo apt-get install libzmq-dev
sudo pip install zmq

Código


Vamos escrever uma classe para trabalhar com nosso servidor:
O tipo de soquete zmq usado é REQ (REQuest, solicitação), envia a solicitação e aguarda uma resposta.
Para armazenar e transferir qualquer tipo de dados pela rede, usamos o módulo pickle padrão. "Protocolo" do trabalho - uma tupla de três valores: (comando, chave, dados)

 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' 


Use

cache = SuperCacher ()
cache.set ('chave', 'valor')
cache.get ('chave')

Como lição de casa, melhore a implementação adicionando a capacidade de especificar um endereço / porta ao criar uma instância da classe.

Agora vamos escrever o próprio servidor.
Desta vez, o soquete REP é usado (REPly, resposta) - estamos aguardando a solicitação, o capacete é a resposta. Analisamos a solicitação, respondemos 'ok' no caso de gravação ou dados / Nenhum no caso de leitura.

 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() 


Para testar tudo junto, inicie o servidor com o comando
python daemon.py

Na próxima guia, inicie o python interativamente.

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


Oh milagre, funciona! Agora você pode escrever com segurança em seu currículo “desenvolvendo armazenamento de valores-chave usando o protocolo zmq”

Source: https://habr.com/ru/post/pt483586/


All Articles