Die Grundlagen der Arbeit mit zmq in Python zum Erstellen eines einfachen Schlüssel- / Wertespeichers

Einleitung


Schauen wir uns ein Beispiel für einen einfachen Schlüssel- / Wertespeicher an, z. B. memcache. Es ist einfach angeordnet - die Daten werden im Speicher in der Hashmap-Struktur gespeichert. Der Zugriff darauf erfolgt über einen TCP-Socket. In Python ist Hashmap ein reguläres Diktat. Für den Zugriff verwenden wir null.

Anpassung


Um dieses Paket in debian / ubuntu zu installieren, geben Sie einfach in die Konsole ein
sudo apt-get install libzmq-dev
sudo pip install zmq

Code


Schreiben wir eine Klasse für die Arbeit mit unserem Server:
Der verwendete zmq-Sockettyp ist REQ (REQuest, request), sendet die Anforderung und wartet auf eine Antwort.
Zum Speichern und Übertragen jeglicher Art von Daten über das Netzwerk verwenden wir das Standard-Pickle-Modul. "Protokoll" der Arbeit - ein Tupel von drei Werten: (Befehl, Schlüssel, Daten)

 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' 


Verwenden Sie

cache = SuperCacher ()
cache.set ('key', 'value')
cache.get ('key')

Verbessern Sie als Hausaufgabe die Implementierung, indem Sie die Möglichkeit hinzufügen, beim Erstellen einer Instanz der Klasse eine Adresse / einen Port anzugeben.

Jetzt schreiben wir den Server selbst.
Diesmal wird die REP-Buchse verwendet (REPly, Response) - wir warten auf die Anfrage, der Helm ist die Antwort. Wir analysieren die Anfrage, antworten beim Schreiben entweder mit 'ok' oder beim Lesen mit '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() 


Um alles zusammen zu testen, starten Sie den Server mit dem Befehl
python daemon.py

Starten Sie auf der nächsten Registerkarte Python interaktiv.

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


Oh Wunder, es funktioniert! Jetzt können Sie sicher in Ihren Lebenslauf schreiben: "Schlüsselwertspeicher mit dem zmq-Protokoll entwickeln".

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


All Articles