Asas bekerja dengan zmq dalam python, mencipta kedai kunci/nilai mudah

Pengenalan

Mari lihat contoh storan kunci/nilai mudah, seperti memcache. Ia direka secara ringkas - data disimpan dalam ingatan, dalam struktur peta hash. Mereka diakses melalui soket tcp. Dalam Python, hashmap ialah dict biasa. Untuk akses kami akan menggunakan zeromq.

pelarasan

Untuk memasang pakej ini dalam debian/ubuntu, hanya masukkan dalam konsol
sudo apt-get install libzmq-dev
sudo pip install zmq

Kod

Mari kita tulis kelas untuk bekerja dengan pelayan kami:
Jenis soket zmq yang digunakan ialah REQ(REQuest, request), kami menghantar permintaan dan menunggu jawapan.
Untuk menyimpan dan menghantar sebarang jenis data melalui rangkaian, kami menggunakan modul jeruk standard. "Protokol" kerja ialah gabungan 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('kunci', 'nilai')
cache.get('key')

Sebagai kerja rumah, perbaiki pelaksanaan dengan menambahkan keupayaan untuk menentukan alamat/port semasa membuat contoh kelas.

Sekarang mari kita tulis pelayan itu sendiri.
Kali ini soket REP(REPly, response) digunakan - kami sedang menunggu permintaan, menghantar jawapan. Kami menghuraikan permintaan dan membalas sama ada dengan 'ok' dalam kes penulisan, atau dengan data / Tiada dalam kes 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-sama, kami memulakan pelayan dengan arahan
python daemon.py

Dalam tab seterusnya, lancarkan python dalam mod interaktif.

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

Oh keajaiban, ia berkesan! Kini anda boleh menulis dengan selamat dalam resume anda "pembangunan storan nilai kunci menggunakan protokol zmq"

Sumber: www.habr.com

Tambah komen