ما هي طرق تشغيل البرنامج النصي من جانب الخادم إلى الأبد؟

StackOverflow https://stackoverflow.com/questions/1427000

سؤال

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

  • كيف يمكنني إدارة شيء مثل هذا؟
  • هل أنا مرتبك؟أم أن هناك طرقًا أفضل لتنفيذ اتصال المقبس غير المتزامن؟
  • بعد بدء تشغيل البرنامج النصي مرة واحدة عبر خادم Apache، كيف يمكنني إيقاف تشغيله؟
هل كانت مفيدة؟

المحلول

إذا كنت تستخدم نظام ملتوي، فهو يحتوي على بنية تحتية كاملة لبدء وإيقاف الشياطين.

http://twistedmatrix.com/projects/core/documentation/howto/application.html

كيف يمكنني إدارة شيء مثل هذا؟

الملتوية تعمل بشكل جيد لهذا، اقرأ الرابط أعلاه

هل أنا مرتبك؟أم أن هناك طرقًا أفضل لتنفيذ اتصال المقبس غير المتزامن؟

Twisted جيد جدًا في اتصالات المقبس غير المتزامنة.إنه أمر صعب على الدماغ حتى تتقنه!

بعد بدء تشغيل البرنامج النصي مرة واحدة عبر خادم Apache، كيف يمكنني إيقاف تشغيله؟

تفترض الأدوات الملتوية الوصول إلى سطر الأوامر، لذا سيتعين عليك كتابة غلاف CGI لبدء/إيقافها إذا فهمت ما تريد القيام به.

نصائح أخرى

يمكنك فقط كتابة برنامج نصي يتم حظره بشكل مستمر لفترة من الوقت في انتظار حدوث الاتصال وينتظر إشارة لإغلاقه.

http://docs.python.org/library/signal.html

ومن ثم لإيقافه، ما عليك سوى تشغيل برنامج نصي آخر يرسل تلك الإشارة إليه.

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

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

بعد بدء تشغيل البرنامج النصي مرة واحدة عبر خادم Apache، كيف يمكنني إيقاف تشغيله؟

لديك الشوكة الثانية التي تكتب رقم العملية (pid) الخاص بالعملية الخفية إلى ملف، ثم تقرأ pid من هذا الملف وترسل إليه إشارة إنهاء (os.kill(pid, signal.SIG_TERM)).

هل أنا مرتبك؟

هذا هو السؤال!أفترض أنك تحاول الحصول على عملية خلفية تستجيب على منفذ مختلف لواجهة الويب لنوع من خدمة الشبكة غير العادية.إذا كنت تتحدث فقط عن الاستجابة لطلبات الويب العادية، فلا ينبغي لك القيام بذلك، فيجب عليك الاعتماد على Apache للتعامل مع مآخذ التوصيل الخاصة بك وخدمة طلب واحد في كل مرة.

أظن المذنب هو ما تبحث عنه.تأكد من إلقاء نظرة على تورنادو أيضًا.

قد ترغب في إلقاء نظرة على FastCGI، فهو يبدو تمامًا مثل ما تبحث عنه، لكنني لست متأكدًا مما إذا كان قيد التطوير الحالي.يستخدم برنامج CGI الخفي ووحدة Apache خاصة للتواصل معه.نظرًا لأن البرنامج الخفي يعمل لفترة طويلة، فلن تكون لديك تكلفة fork/exec.ولكن كتكلفة لإدارة مواردك الخاصة (لا يوجد تنظيف تلقائي عند كل طلب)

أحد أسباب عدم استخدام هذا النمط من FastCGI كثيرًا هو أن هناك طرقًا لتضمين المترجمين الفوريين في ملف Apache الثنائي وتشغيلهم في الخادم.لست على دراية بـ mod_python، لكني أعلم أن mod_perl لديه تكوين يسمح بالعمليات طويلة الأمد.كن حذرًا هنا، نظرًا لأن العملية الطويلة في الخادم يمكن أن تسبب تسربًا للموارد.

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

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