Dasar-dasar bekerja dengan zmq dalam python, membuat penyimpanan kunci / nilai sederhana

Pendahuluan


Mari kita lihat contoh penyimpanan kunci / nilai sederhana, seperti memcache. Ini hanya diatur - data disimpan dalam memori, dalam struktur hashmap. Akses ke mereka adalah melalui soket tcp. Dalam python, hashmap adalah dict biasa. Untuk akses kita akan menggunakan zeromq.

Kustomisasi


Untuk menginstal paket ini di debian / ubuntu cukup masukkan di konsol
sudo apt-get install libzmq-dev
sudo pip install zmq

Kode


Mari menulis kelas untuk bekerja dengan server kami:
Jenis soket zmq yang digunakan adalah REQ (REQuest, request), mengirim permintaan, dan menunggu jawaban.
Untuk menyimpan dan mentransfer semua jenis data melalui jaringan, kami menggunakan modul acar standar. "Protocol" of work - tuple dari tiga nilai: (perintah, kunci, data)

 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' 


Gunakan

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

Sebagai pekerjaan rumah, tingkatkan implementasinya dengan menambahkan kemampuan untuk menentukan alamat / port saat membuat instance kelas.

Sekarang kita akan menulis servernya sendiri.
Kali ini, soket REP (REPly, response) digunakan - kami sedang menunggu permintaan, helm adalah jawabannya. Kami menguraikan permintaan, menjawab 'ok' dalam kasus penulisan, atau data / Tidak ada dalam kasus membaca.

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


Untuk menguji semuanya bersama, mulai server dengan perintah
python daemon.py

Di tab berikutnya, luncurkan python secara interaktif.

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


Astaga, itu berhasil! Sekarang Anda dapat dengan aman menulis di resume Anda "mengembangkan penyimpanan nilai kunci menggunakan protokol zmq"

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


All Articles