Tushen aiki tare da zmq a cikin Python, ƙirƙirar maɓalli mai sauƙi / kantin ƙima

Gabatarwar

Bari mu kalli misalin maɓalli mai sauƙi/ma'aji mai ƙima, kamar memcache. An tsara shi kawai - ana adana bayanan a cikin ƙwaƙwalwar ajiya, a cikin tsarin hashmap. Ana samun su ta hanyar tcp soket. A Python, hashmap dict ne na yau da kullun. Don samun dama za mu yi amfani da zeromq.

gyara

Don shigar da wannan fakitin a cikin debian/ubuntu, kawai shigar a cikin na'ura wasan bidiyo
sudo apt-get install libzmq-dev
sudo pip install zmq

Lambar

Bari mu rubuta aji don yin aiki tare da uwar garken mu:
Nau'in soket ɗin zmq da aka yi amfani da shi shine REQ (REQuest, request), muna aika buƙatar kuma jira amsa.
Don adanawa da watsa kowane nau'in bayanai akan hanyar sadarwar, muna amfani da daidaitaccen tsarin pickle. Aikin "la'irar" ruple ne na dabi'u uku: (umurni, maɓalli, bayanai)

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'
Amfani

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

A matsayin aikin gida, haɓaka aiwatarwa ta ƙara ikon tantance adireshi/tashar ruwa lokacin ƙirƙirar misali na aji.

Yanzu bari mu rubuta uwar garken kanta.
Wannan lokacin ana amfani da soket REP (REPly, amsa) - muna jiran buƙatar, aika amsa. Muna rarraba buƙatun kuma mu amsa ko dai tare da 'ok' a yanayin rubutu, ko tare da bayanai / Babu wani cikin yanayin karatu.

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

Don gwada komai tare, muna fara uwar garken tare da umarnin
python daemon.py

A cikin shafi na gaba, ƙaddamar da Python a cikin yanayin mu'amala.

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

Oh mu'ujiza, yana aiki! Yanzu zaku iya rubuta cikin aminci a cikin ci gaba naku "haɓaka ma'ajin ƙima ta amfani da tsarin zmq"

source: www.habr.com

Add a comment