سؤال

أقوم بإنشاء برنامج يحتوي على فئة تستخدم محليًا، ولكنني أريد أن يتم استخدام نفس الفئة بنفس الطريقة عبر الشبكة.هذا يعني أنني بحاجة إلى أن أكون قادرًا على إجراء مكالمات متزامنة لأي من طرقها العامة.يقرأ الفصل الملفات ويكتبها، لذلك أعتقد أن XML-RPC يثقل كاهله.لقد قمت بإنشاء عميل/خادم RPC أساسي باستخدام الأمثلة من Twisted، لكني أواجه مشكلة مع العميل.

c = ClientCreator(reactor, Greeter)
c.connectTCP(self.host, self.port).addCallback(request)
reactor.run()

يعمل هذا مع مكالمة واحدة، عندما يتم استلام البيانات، أقوم بالاتصال بـreactor.stop()، ولكن إذا قمت بإجراء أي مكالمات أخرى، فلن يتم إعادة تشغيل المفاعل.هل هناك شيء آخر يجب أن أستخدمه لهذا؟ربما وحدة ملتوية مختلفة أو إطار عمل آخر؟

(لا أقوم بتضمين تفاصيل كيفية عمل البروتوكول، لأن النقطة الرئيسية هي أنني أتلقى مكالمة واحدة فقط من هذا.)

إضافة وتوضيح:

لقد قمت بمشاركة مستند Google يحتوي على ملاحظات حول ما أفعله. http://docs.google.com/Doc?id=ddv9rsfd_37ftshgpgz

لدي نسخة مكتوبة تستخدم المصهر ويمكنها دمج عدة مجلدات محلية في نقطة تثبيت المصهر.تتم معالجة الوصول إلى الملفات بالفعل داخل الفصل الدراسي، لذلك أريد أن يكون لدي خوادم تتيح لي الوصول إلى الشبكة إلى نفس الفصل.بعد مواصلة البحث، أظن أن البيرو (http://pyro.sourceforge.net/) قد يكون ما أبحث عنه حقًا (استنادًا ببساطة إلى قراءة صفحتهم الرئيسية الآن) ولكني منفتح على أي اقتراحات.

يمكنني تحقيق نتائج مماثلة باستخدام تركيب nfs ودمجه مع المجلد المحلي الخاص بي، ولكنني أريد أن يتمكن جميع الأقران من الوصول إلى نفس نظام الملفات المدمج، لذلك سيتطلب ذلك من كل كمبيوتر أن يستقبل خادم nfs بعدد من nfs يتصاعد يساوي عدد أجهزة الكمبيوتر في الشبكة.

خاتمة:لقد قررت استخدام rpyc لأنه أعطاني بالضبط ما كنت أبحث عنه.خادم يحتفظ بمثيل للفئة التي يمكنني التعامل معها كما لو كانت محلية.إذا كان أي شخص مهتمًا، فقد قمت بوضع مشروعي على Launchpad (http://launchpad.net/dstorage).

هل كانت مفيدة؟

المحلول

إذا كنت تفكر في استخدام Pyro، فراجع ذلك RPyC أولاً، وأعد النظر في XML-RPC.

بخصوص الملتوية:حاول ترك المفاعل مفتوحًا بدلاً من إيقافه، وفقط ClientCreator(...).connectTCP(...) كل مرة.

اذا أنت self.transport.loseConnection() في البروتوكول الخاص بك لن تترك اتصالات مفتوحة.

نصائح أخرى

لماذا تشعر أنه يجب أن يكون متزامنا؟

إذا كنت تريد التأكد من حدوث واحدة فقط من هذه الاستدعاءات في كل مرة، فاستدعاء كافة الاستدعاءات من خلال إشارة مؤجلة حتى تتمكن من تحديد معدل الاستدعاءات الفعلية (إلى أي قيمة عشوائية).

إذا كنت تريد أن تكون قادرًا على تشغيل تدفقات متعددة من هذه في أوقات مختلفة، ولكن لا تهتم بحدود التزامن، فيجب عليك على الأقل فصل بدء تشغيل المفاعل وتفكيكه عن الاستدعاءات (يجب أن يعمل المفاعل طوال عمر العملية بالكامل) ).

إذا لم تتمكن من معرفة كيفية التعبير عن منطق التطبيق الخاص بك في نمط المفاعل، فيمكنك استخدام deferToThread وكتابة جزء من التعليمات البرمجية المتزامنة تمامًا - على الرغم من أنني أعتقد أن هذا لن يكون ضروريًا.

بالنسبة للعميل المتزامن، ربما لا يكون Twisted هو الخيار الصحيح.بدلاً من ذلك، قد ترغب في استخدام وحدة المقبس مباشرة.

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((self.host, self.port))
s.send(output)
data = s.recv(size)
s.close()

ال recv() قد يلزم تكرار المكالمة حتى تحصل على سلسلة فارغة، ولكن هذا يوضح الأساسيات.

وبدلاً من ذلك، يمكنك إعادة ترتيب البرنامج بأكمله لدعم المكالمات غير المتزامنة...

إذا كنت تستخدم Twisted، فمن المحتمل أن تعرف ما يلي:

  1. لن تقوم بإجراء مكالمات متزامنة لأي خدمة شبكة
  2. لا يمكن تشغيل المفاعل إلا مرة واحدة، لذا لا توقفه (عن طريق الاتصال reactor.stop()) حتى يصبح تطبيقك جاهزًا للخروج.

آمل أن يكون هذا يجيب عن سؤالك.أنا شخصياً أعتقد أن Twisted هو بالضبط الحل الصحيح لحالة الاستخدام الخاصة بك، ولكنك تحتاج إلى حل مشكلة التزامن لديك.

إضافة وتوضيح:

Part of what I don't understand is that when I call reactor.run() it seems to go into a loop that just watches for network activity. How do I continue running the rest of my program while it uses the network? if I can get past that, then I can probably work through the synchronicity issue.

هذا هو بالضبط ما يفعله Reactor.run() .يتم تشغيل حلقة رئيسية وهي مفاعل الحدث.لن يقتصر الأمر على انتظار أحداث العمل فحسب، بل سينتظر أي شيء آخر قمت بجدولته لحدوثه.مع Twisted، ستحتاج إلى تنظيم بقية تطبيقك بطريقة للتعامل مع طبيعته غير المتزامنة.ربما لو كنا نعرف نوع التطبيق، يمكننا أن ننصح.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top