سؤال

أنا أبحث عن خادم ويب بيثون متعدد الخيوط بدلاً من أن يكون متعدد العمليات (كما في حالة mod_python لـ Apache).أريد أن يكون متعدد الخيوط لأنني أرغب في الحصول على ذاكرة تخزين مؤقت للكائنات في الذاكرة والتي سيتم استخدامها بواسطة سلاسل عمليات http المختلفة.يقوم خادم الويب الخاص بي بالكثير من الأشياء باهظة الثمن ويحسب بعض المصفوفات الكبيرة التي يجب تخزينها مؤقتًا في الذاكرة لاستخدامها في المستقبل لتجنب إعادة الحساب.هذا غير ممكن في بيئة خادم ويب متعددة العمليات.تخزين هذه المعلومات في ذاكرة التخزين المؤقت ليس فكرة جيدة أيضًا لأن المصفوفات كبيرة وتخزينها في ذاكرة التخزين المؤقت سيؤدي إلى إلغاء تسلسل البيانات القادمة من ذاكرة التخزين المؤقت بصرف النظر عن الحمل الإضافي لـ IPC.

لقد قمت بتنفيذ خادم ويب بسيط باستخدام BaseHttpServer، وهو يقدم أداءً جيدًا ولكنه يتعطل بعد بضع ساعات.أحتاج إلى خادم ويب أكثر نضجًا.هل من الممكن تكوين Apache لاستخدام mod_python ضمن نموذج مؤشر ترابط حتى أتمكن من القيام ببعض التخزين المؤقت للكائنات؟

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

المحلول

CherryPy.المميزات كما ذكرت من الموقع:

  • خادم ويب سريع ومتوافق مع HTTP/1.1 ومجمع WSGI.عادةً، يستغرق CherryPy نفسه من 1 إلى 2 مللي ثانية فقط لكل صفحة!
  • دعم أي خادم ويب أو محول آخر يدعم WSGI، بما في ذلك Apache وIIS وlighttpd وmod_python وFastCGI وSCGI وmod_wsgi
  • من السهل تشغيل خوادم HTTP متعددة (على سبيل المثال.على منافذ متعددة) في وقت واحد
  • نظام تكوين قوي للمطورين والناشرين على حد سواء
  • نظام البرنامج المساعد مرنة
  • أدوات مدمجة للتخزين المؤقت والتشفير والجلسات والترخيص والمحتوى الثابت وغير ذلك الكثير
  • محول mod_python أصلي
  • مجموعة اختبار كاملة
  • قابلة للتبديل والتخصيص...كل شيء.
  • المدمج في التنميط، والتغطية، ودعم الاختبار.

نصائح أخرى

والنظر في إعادة النظر في التصميم الخاص بك. مؤكدا أن دولة كبيرة في خادم الويب من المحتمل ان يكون فكرة سيئة. متعدد العملية هي الطريقة أفضل بكثير للذهاب للاستقرار.

هل هناك طريقة أخرى لمشاركة الدولة بين عمليات منفصلة؟ ماذا عن الخدمات؟ قاعدة البيانات؟ فهرس؟

ويبدو من غير المحتمل أن الحفاظ على مجموعة ضخمة من البيانات في الذاكرة والاعتماد على عملية متعددة الخيوط واحدة لخدمة جميع طلباتك هو أفضل تصميم أو الهندسة المعمارية للتطبيق.

ملتوية يمكن أن تكون بمثابة مثل خادم الويب. في حين لم متعددة مؤشرات الترابط نفسه، هناك (لم يفرج عنه) مؤشرات الحاضر حاوية WSGI في الجذع الحالي. يمكنك التحقق من مستودع SVN ثم قم بتشغيل:

twistd web --wsgi=your.wsgi.application

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

لا مؤشرات، ولكن الملتوية قد تخدم احتياجاتك.

هل يمكن بدلا من ذلك استخدام ذاكرة التخزين الموزعة التي يمكن الوصول إليها من كل عملية، أعطها كونه المثال أن يخطر بالبال.

لقد جعلت web.py لي سعيد في الماضي. النظر في التحقق من ذلك.

ولكن هل يبدو وكأنه إعادة تصميم المعماري قد يكون الصحيح، وإن كان أكثر تكلفة، والحل.

وربما كان لديك مشكلة مع التطبيق الخاص بك في بيثون باستخدام BaseHttpServer. ليس هناك سبب لذلك ل"تتعثر"، وتنفيذ الخادم الخيوط بسيط باستخدام BaseHttpServer وthreading لا ينبغي أن يكون صعبا.

وانظر أيضا http://pymotw.com/2/BaseHTTPServer/ index.html و# حدة نمطية BaseHTTPServer حول تنفيذ متعددة الخيوط خادم بسيط مع HTTPServer وThreadingMixIn

وأنا استخدم CherryPy الصعيدين الشخصي والمهني، وأنا سعيد للغاية معها. حتى أن أفعل ذلك النوع من شيء كنت تصف، مثل وجود مخابئ الكائن العالمية، وتشغيل المواضيع الأخرى في الخلفية، وغيرها، وأنه يدمج جيدا مع اباتشي. ببساطة تشغيل CherryPy كخادم مستقل منضما إلى المضيف المحلي، ثم استخدم mod_proxy أباتشي وmod_rewrite أن يكون أباتشي بشفافية قدما طلبات لCherryPy.

والموقع CherryPy هو http://cherrypy.org/

في الواقع واجهت نفس المشكلة مؤخرًا.يسمى:لقد كتبنا خادمًا بسيطًا باستخدام BaseHTTPServer ووجدنا أن حقيقة أنه ليس متعدد الخيوط كان عيبًا كبيرًا.

كان الحل الذي توصلت إليه هو نقل الخادم إلى Pylons (http://pylonshq.com/).كان المنفذ سهلاً إلى حد ما وكانت إحدى الفوائد هي أنه من السهل جدًا إنشاء واجهة المستخدم الرسومية باستخدام Pylons لذلك تمكنت من إنشاء صفحة حالة فوق ما يعد في الأساس عملية خفية.

أود تلخيص الأبراج بهذه الطريقة:

  • إنه مشابه لـ Ruby on Rails من حيث أنه يهدف إلى أن يكون من السهل جدًا نشر تطبيقات الويب
  • إنها لغة القوالب الافتراضية، Mako، من الجيد جدًا العمل معها
  • فهو يستخدم نظامًا مريحًا للغاية لتوجيه عناوين URL
  • بالنسبة لنا، لا يمثل الأداء مشكلة، لذلك لا يمكنني ضمان أن تعمل Pylons بشكل مناسب لتلبية احتياجاتك
  • يمكنك استخدامه مع Apache & Lighthttpd، على الرغم من أنني لم أجرب ذلك

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

حظ سعيد.

وفقط أن نشير إلى شيء مختلف عن المعتاد المشتبه بهم ...

وقبل بضع سنوات حين كنت تستخدم Zope الإصدار 2.x قرأت عن <لأ href = "HTTP: / /www.nightmare.com/medusa/medusa.html "يختلط =" نوفولو noreferrer "> ميدوسا كما كان خادم الويب المستخدمة في النظام الأساسي. أنهم الإعلان على العمل بشكل جيد تحت عبء ثقيل ويمكن أن توفر لك وظيفة طلبتم.

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