اصول کار با zmq در پایتون، ایجاد یک فروشگاه کلید/مقدار ساده

معرفی

بیایید به نمونه ای از یک ذخیره سازی کلید/مقدار ساده، مانند memcache نگاه کنیم. این به سادگی طراحی شده است - داده ها در حافظه، در ساختار هشمپ ذخیره می شوند. آنها از طریق یک سوکت tcp قابل دسترسی هستند. در پایتون، هشمپ یک دستور معمولی است. برای دسترسی از zeromq استفاده می کنیم.

تنظیم

برای نصب این بسته در debian/ubuntu کافیست وارد کنسول شوید
sudo apt-get install libzmq-dev
sudo pip install zmq

رمز

بیایید یک کلاس برای کار با سرور خود بنویسیم:
نوع سوکت zmq مورد استفاده REQ (REQuest، درخواست) است، ما یک درخواست ارسال می کنیم و منتظر پاسخ هستیم.
برای ذخیره و انتقال هر نوع داده از طریق شبکه، از ماژول استاندارد pickle استفاده می کنیم. پروتکل کار مجموعه ای از سه مقدار است: (فرمان، کلید، داده)

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'
استفاده

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

به عنوان تکلیف، پیاده سازی را با افزودن قابلیت تعیین آدرس/پورت هنگام ایجاد نمونه ای از یک کلاس، بهبود بخشید.

حالا بیایید خود سرور را بنویسیم.
این بار از سوکت REP (REPly، پاسخ) استفاده می شود - ما منتظر درخواست هستیم و پاسخ را ارسال می کنیم. ما درخواست را تجزیه می کنیم و در مورد نوشتن با "ok" یا در مورد خواندن با داده / هیچ پاسخ می دهیم.

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

برای آزمایش همه چیز با هم، سرور را با دستور شروع می کنیم
python daemon.py

در تب بعدی، پایتون را در حالت تعاملی اجرا کنید.

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

اوه معجزه، کار می کند! اکنون می توانید با خیال راحت در رزومه خود بنویسید "توسعه ذخیره سازی کلید ارزش با استفاده از پروتکل zmq"

منبع: www.habr.com

اضافه کردن نظر