أساسيات العمل مع zmq في بيثون ، وإنشاء متجر مفتاح / قيمة بسيط

مقدمة


دعونا نلقي نظرة على مثال لتخزين مفتاح / قيمة بسيط ، مثل memcache. يتم ترتيبها ببساطة - يتم تخزين البيانات في الذاكرة ، في بنية hashmap. الوصول إليهم عبر مقبس tcp. في الثعبان ، hashmap هو إملاء منتظم. للوصول سوف نستخدم zeromq.

تعديل


لتثبيت هذه الحزمة في debian / ubuntu ، ما عليك سوى إدخال وحدة التحكم
sudo apt-get install libzmq-dev
sudo pip install zmq

قانون


دعنا نكتب فئة للعمل مع خادمنا:
نوع مقبس zmq المستخدم هو REQ (REQuest ، طلب) ، إرسال الطلب ، وانتظر استجابة.
لتخزين ونقل أي نوع من البيانات عبر الشبكة ، نستخدم وحدة المخلل القياسية. "بروتوكول" العمل - مجموعة من ثلاث قيم: (أمر ، مفتاح ، بيانات)

 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 ('مفتاح' ، 'قيمة')
cache.get ('مفتاح')

كواجب منزلي ، قم بتحسين التنفيذ عن طريق إضافة القدرة على تحديد عنوان / منفذ عند إنشاء مثيل للفئة.

الآن سوف نكتب الخادم نفسه.
هذه المرة ، يتم استخدام مأخذ REP (الرد ، الاستجابة) - نحن في انتظار الطلب ، والخوذة هي الحل. نقوم بتحليل الطلب ، والإجابة إما "موافق" في حالة الكتابة ، أو مع / بلا بيانات في حالة القراءة.

 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"

Source: https://habr.com/ru/post/ar483586/


All Articles