Dasar gawé bareng zmq di python, nyieun konci basajan / toko nilai

perkenalan

Hayu urang tingali conto panyimpen konci/nilai basajan, sapertos memcache. Éta dirancang ngan saukur - data disimpen dina mémori, dina struktur hashmap. Éta diaksés via stop kontak tcp. Dina Python, hashmap mangrupikeun dict biasa. Pikeun aksés kami bakal nganggo zeromq.

carana ngatur

Pikeun masang pakét ieu dina debian/ubuntu, lebetkeun kana konsol
sudo apt-get install libzmq-dev
sudo pip install zmq

kode

Hayu urang nyerat kelas pikeun damel sareng server kami:
Jinis stop kontak zmq dipaké nyaéta REQ (REQuest, pamundut), urang ngirim pamundut jeung ngadagoan respon.
Pikeun nyimpen jeung ngirimkeun sagala jenis data ngaliwatan jaringan, kami nganggo modul acar baku. Karya "protokol" mangrupakeun tuple tina tilu nilai: (komando, konci, 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'
pamakean

cache = SuperCacher()
cache.set( 'konci', 'nilai')
cache.get ( 'konci')

Salaku PR, ningkatkeun palaksanaan ku nambahkeun kamampuhan pikeun nangtukeun alamat / port nalika nyieun hiji conto kelas.

Ayeuna hayu urang nulis server sorangan.
waktos Ieu stop kontak REP (REPly, respon) dipaké - urang ngantosan pamundut, ngirim respon. Urang parse pamundut jeung ngabales boh kalawan 'ok' dina kasus tulisan, atawa kalawan data / Euweuh dina kasus 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()

Pikeun nguji sagalana babarengan, urang mimitian server kalawan paréntah
python daemon.py

Dina tab salajengna, ngajalankeun python dina modeu interaktif.

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

Oh mujijat, éta jalan! Ayeuna anjeun aman tiasa nyerat dina resume anjeun "ngembangkeun neundeun nilai konci nganggo protokol zmq"

sumber: www.habr.com

Tambahkeun komentar