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

pengenalan

Mari kita lihat contoh penyimpanan kunci/nilai sederhana, seperti memcache. Ini dirancang secara sederhana - data disimpan dalam memori, dalam struktur hashmap. Mereka diakses melalui soket tcp. Di Python, hashmap adalah dict biasa. Untuk akses kita akan menggunakan zeromq.

pengaturan

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

kode

Mari kita menulis kelas untuk bekerja dengan server kita:
Jenis soket zmq yang digunakan adalah REQ(REQuest, request), kami mengirimkan permintaan dan menunggu tanggapan.
Untuk menyimpan dan mengirimkan segala jenis data melalui jaringan, kami menggunakan modul acar standar. "Protokol" kerja adalah rangkaian 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'
Menggunakan

cache = SuperCacher()
cache.set('kunci', 'nilai')
cache.dapatkan('kunci')

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

Sekarang mari kita menulis server itu sendiri.
Kali ini soket REP(REPly, respon) digunakan - kami menunggu permintaan, mengirimkan respons. Kami menguraikan permintaan dan merespons dengan 'ok' jika ditulis, atau dengan data / Tidak Ada jika dibaca.

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 memulai server dengan perintah
python daemon.py

Di tab berikutnya, luncurkan python dalam mode interaktif.

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

Oh keajaiban, itu berhasil! Sekarang Anda dapat dengan aman menulis di resume Anda “pengembangan penyimpanan nilai kunci menggunakan protokol zmq”

Sumber: www.habr.com

Tambah komentar