Dasar nggarap zmq ing python, nggawe toko kunci / nilai sing prasaja

Pambuka

Ayo goleki conto panyimpenan kunci/nilai sing prasaja, kayata memcache. Iki dirancang kanthi prasaja - data disimpen ing memori, ing struktur hashmap. Dheweke diakses liwat soket tcp. Ing Python, hashmap minangka dict biasa. Kanggo akses kita bakal nggunakake zeromq.

imbuhan

Kanggo nginstal paket iki ing debian/ubuntu, ketik console
sudo apt-get install libzmq-dev
sudo pip install zmq

Kode

Ayo nulis kelas kanggo nggarap server kita:
Jinis soket zmq sing digunakake yaiku REQ (REQuest, request), kita ngirim panjalukan lan ngenteni respon.
Kanggo nyimpen lan ngirim jinis data liwat jaringan, kita nggunakake modul pickle standar. "Protokol" karya minangka tuple saka telung nilai: (command, key, 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'
Gunakake

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

Minangka peer, nambah implementasine kanthi nambah kemampuan kanggo nemtokake alamat / port nalika nggawe conto saka kelas.

Saiki ayo nulis server dhewe.
Wektu iki soket REP (REPly, respon) digunakake - kita nunggu panjalukan, ngirim respon. We parse panjalukan lan nanggapi salah siji karo 'ok' ing cilik saka nulis, utawa karo data / Ora ana ing cilik saka maca.

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

Kanggo nyoba kabeh bebarengan, kita miwiti server karo printah
python daemon.py

Ing tab sabanjure, bukak python ing mode interaktif.

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

Oh Ajaib, kerjane! Saiki sampeyan bisa nulis kanthi aman ing resume "pangembangan panyimpenan kunci-nilai nggunakake protokol zmq"

Source: www.habr.com

Add a comment