كيفية إيقاف خادم ويب الزجاجة عندما تبدأ من العملية الفرعية

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

سؤال

أود تضمين العظيم زجاجة إطار الويب في تطبيق صغير (الهدف الأول هو نظام التشغيل Windows). يبدأ هذا التطبيق خادم ويب الزجاجة بفضل وحدة التخطيط الفرعي.

import subprocess
p = subprocess.Popen('python websrv.py')

تطبيق الزجاجة بسيط للغاية

@route("/")
def index():
    return template('index')

run(reloader=True)

يبدأ خادم الويب الافتراضي في وحدة تحكم Windows.

يبدو كل شيء على ما يرام باستثناء حقيقة أنه يجب علي الضغط على Ctrl-C لإغلاق خادم الويب. أود أن ينهي التطبيق الرئيسي خادم الويب عند إغلاقه. لا يمكنني إيجاد طريقة للقيام بذلك (P.Terminate () لا يعمل في هذه الحالة للأسف)

اي فكرة؟

شكرا لك مقدما

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

المحلول

هناك طريقتان لإغلاق خادم إعادة تحميل:

1) يمكنك إنهاء P (باستخدام os.kill(p.pid) أو p.terminate() ) ثم قم بتغيير وقت تعديل "websrv.py" (os.utime('websrv.py')) لتشغيل إغلاق تلقائي لعملية الطفل.

2) يمكنك إنهاء P مع os.kill(p.pid, signal.SIGINT) وهو مطابق ل Ctrl-C اغلق.

نصائح أخرى

يبدو أن عملية الإنهاء لا تعمل إذا كانت الزجاجة في وضع إعادة التحميل. في هذه الحالة ، يبدأ الأمر في عملية فرعية.

إذا تم ضبط إعادة التحميل على خطأ ، يبدو أن الإنهاء يعمل بشكل جيد.

بدءًا من 0.8.1 خادم إعادة التحميل ذكي بما يكفي لتنظيف عمليات اليتيم. لديك الآن عدة طرق لإنهاء الخادم:

  • نجاح Ctrl-C أو أرسل SIGINT لعملية الوالدين. (مستحسن)
  • اقتل عملية الوالدين. سوف يموت الطفل بأمان في غضون ثانيتين.
  • اقتل عملية الطفل أو sys.exit () مع أي رمز الحالة بخلاف 3. سيموت الوالد على الفور.

واجهت مشكلة في إغلاق خادم الزجاجة من داخل الطلب حيث يبدو أن الزجاجة تدير الطلبات في العمليات الفرعية.

وجدت في النهاية أن الحل كان للقيام:

sys.stderr.close()

داخل الطلب (الذي تم تمريره إلى خادم الزجاجة وأمسكه).

ربما حاول القيام بذلك في عمليتك ومعرفة ما إذا كانت الزجاجة تحصل على الرسالة.

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