it-swarm.asia

هل يمكنني تقديم خدمة عملاء متعددين باستخدام تطبيق Flask app.run () المستقل فقط؟

أعلم أنه يمكنني ربط Flask بـ Apache أو خوادم الويب الأخرى. ولكن ، كنت أفكر في تشغيل Flask كخادم مستقل يخدم عدة عملاء في وقت واحد.

هل هذا ممكن؟ هل يجب علي التعامل مع عملية وضع مؤشرات ترابط متعددة وإدارتها؟

171
ATOzTOA

flask.Flask.run يقبل وسيطات الكلمات الرئيسية الإضافية (**options) التي تعيد توجيهها إلى werkzeug.serving.run_simple - اثنتان من هذه الوسيطات هما threaded (والتي يمكنك ضبطها على True لتمكين الترابط) و processes (التي يمكنك ضبطها على رقم أكبر) من واحد ليضع werkzeug أكثر من عملية لمعالجة الطلبات). إذا كنت تفعل:

if __== '__main__':
    app.run(threaded=True)
    # Alternately
    # app.run(processes=3)

ستخبر Flask Werkzeug أن يستخدم الخيوط وأن يفرز ثلاث عمليات لمعالجة الطلبات الواردة.

ومع ذلك ، فإن serving.run_simple الخاصة بـ Werkzeug تلتف/ wsgiref package الخاصة بالمكتبة القياسية ، وتتضمن تلك الحزمة تطبيق مرجع لـ WSGI ، وليس خادم ويب جاهز للإنتاج. إذا كنت ستستخدم Flask في الإنتاج (بافتراض أن "الإنتاج" ليس تطبيقًا داخليًا منخفض الحركة ولا يزيد عن 10 مستخدمين متزامنين) ، فتأكد من وضعه خلف خادم ويب حقيقي (انظر قسم مستندات Flask بعنوان خيارات النشر لبعض الطرق المقترحة).

245
Sean Vieira

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

من المحتمل ألا يؤدي وضع مؤشرات الترابط وإدارتها بنفسك إلى الحصول على نتائج بعيدة جدًا ، بسبب Python GIL .

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

لا يزال ، حتى Gunicorn ربما لا ينبغي أن يتعرض مباشرة للجمهور. في الإنتاج ، يجب استخدامه خلف خادم HTTP أكثر قوة ؛ nginx يميل إلى أن يسير على ما يرام مع Gunicorn وقارورة.

54
Ryan Artecona