एकल फ्लास्क प्रक्रिया में कितने समवर्ती अनुरोध प्राप्त होते हैं?


138

मैं फ्लास्क के साथ एक ऐप बना रहा हूं, लेकिन मुझे डब्ल्यूएसजीआई के बारे में ज्यादा जानकारी नहीं है और यह एचटीटीपी बेस, वरकजग है। जब मैं gunicorn और 4 कार्यकर्ता प्रक्रियाओं के साथ फ्लास्क एप्लिकेशन परोसना शुरू करता हूं, तो क्या इसका मतलब यह है कि मैं 4 समवर्ती अनुरोधों को संभाल सकता हूं?

मेरा मतलब समवर्ती अनुरोधों से है, न कि प्रति सेकंड या कुछ और के अनुरोधों से।

जवाबों:


183

विकास सर्वर को चलाते समय - जो आपको चलाने से मिलता है app.run(), आपको एक समकालिक प्रक्रिया मिलती है, जिसका अर्थ है कि एक बार में अधिकतम 1 अनुरोध पर कार्रवाई की जा रही है।

अपने डिफ़ॉल्ट कॉन्फ़िगरेशन में इसके सामने Gunicorn को चिपकाकर और बस की संख्या में वृद्धि करके --workers, जो आपको मिलता है वह अनिवार्य रूप से कई प्रक्रियाओं (Gunicorn द्वारा प्रबंधित) है जो प्रत्येक app.run()विकास सर्वर की तरह व्यवहार करता है। 4 कार्यकर्ता == 4 समवर्ती अनुरोध। ऐसा इसलिए है क्योंकि Gunicorn syncडिफ़ॉल्ट रूप से अपने सम्मिलित कार्यकर्ता प्रकार का उपयोग करता है ।

यह नोट करना महत्वपूर्ण है कि Gunicorn भी अतुल्यकालिक कार्यकर्ताओं, अर्थात् शामिल eventletऔर gevent(और यह भी tornado, लेकिन वह सबसे अच्छा तूफान ढांचे के साथ प्रयोग किया जाता है, ऐसा लगता है)। --worker-classध्वज के साथ इन async श्रमिकों में से किसी एक को निर्दिष्ट करके , आपको जो कुछ मिलता है, वह है Gunicorn, कई Async प्रक्रियाओं का प्रबंधन करता है, जिनमें से प्रत्येक अपनी स्वयं की संगामिति का प्रबंधन करता है। इन प्रक्रियाओं में थ्रेड्स का उपयोग नहीं किया जाता है, बल्कि कॉरआउट्स होते हैं। मूल रूप से, प्रत्येक प्रक्रिया के भीतर, अभी भी एक समय (1 थ्रेड) पर केवल 1 चीज हो रही है, लेकिन वस्तुओं को 'रोका' जा सकता है जब वे समाप्त होने के लिए बाहरी प्रक्रियाओं पर विचार कर रहे हैं (डेटाबेस प्रश्नों पर विचार करें या नेटवर्क I / O पर प्रतीक्षा करें)।

इसका मतलब है, यदि आप गिन्कोर्न के एसिंक्स श्रमिकों में से एक का उपयोग कर रहे हैं, तो प्रत्येक कार्यकर्ता एक बार में एक से अधिक अनुरोधों को संभाल सकता है। बस कितने कार्यकर्ता सर्वश्रेष्ठ हैं यह आपके ऐप की प्रकृति, उसके वातावरण, उस पर चलने वाले हार्डवेयर आदि पर निर्भर करता है। अधिक जानकारी Gunicorn के डिज़ाइन पृष्ठ पर पाई जा सकती है और इस बात पर ध्यान दिया जाता है कि इसके इंट्रो पेज पर जियवेंट कैसे काम करता है


4
Gunicorn अब संस्करण 19 से "वास्तविक" थ्रेड्स का समर्थन करता है। इसे और इसे देखें ।
फिलिप कोर्रेया

2
कोई कैसे जानकारी साझा करता है (और कैसे) का ट्रैक रखता है और जो थ्रेड / प्रक्रियाओं के बीच पूरी तरह से अलग हैं? उदाहरण के लिए, मैं ऐसी स्थिति को कैसे संभालूंगा जहां मैं Gunicorn द्वारा संभाला गया और फ्लास्क संचालकों में उपयोग की जाने वाली कई प्रक्रियाओं के बीच एक विशाल डेटास्ट्रक्चर साझा करना चाहता हूं?
जोहान पेट्रक

आप जो पूछ रहे हैं @ जोहेम यह पूछने की तरह है कि ऑपरेटिंग सिस्टम के भीतर विभिन्न प्रक्रियाओं के बीच डेटा कैसे साझा किया जाए। इसका उत्तर आपके प्रश्न का उत्तर दे सकता है, आपको बाहरी भंडारण का उपयोग करना होगा क्योंकि प्रक्रियाएं अन्य प्रक्रियाओं के साथ इसकी मेमोरी साझा नहीं करती हैं। Gunicorn यहां केवल बहु-आयामी सीपीयू आर्किटेक्चर का उपयोग करने के लिए है, लेकिन उन मुद्दों को नहीं संभालता है।
adkl

ईव के बारे में क्या? क्या यह ईव के लिए भी है?
इस्वर

2
फ्लास्क डेवलपमेंट सर्वर v1.0 के बाद से थ्रेड्स का उपयोग करता है ( github.com/pallets/flask/pull/2529 )
hychou

40

वर्तमान में पहले से उपलब्ध कराए गए उपायों की तुलना में कहीं अधिक सरल समाधान है। अपना एप्लिकेशन चलाते समय आपको threaded=Trueपैरामीटर को app.run()कॉल करने के लिए पास करना होगा , जैसे:

app.run(host="your.host", port=4321, threaded=True)

एक अन्य विकल्प जो हम werkzeug डॉक्स में देख सकते हैं , के अनुसार processesपैरामीटर का उपयोग करना है, जो एक नंबर प्राप्त करता है> 1 समवर्ती प्रक्रियाओं की अधिकतम संख्या को संभालने के लिए संकेत करता है:

  • पिरोया - प्रक्रिया को एक अलग धागे में प्रत्येक अनुरोध को संभालना चाहिए?
  • प्रक्रियाएं - यदि 1 से अधिक है तो इस नई प्रक्रिया में प्रत्येक अनुरोध को अधिकतम समवर्ती प्रक्रियाओं तक संभालें।

कुछ इस तरह:

app.run(host="your.host", port=4321, processes=3) #up to 3 processes

यहाँrun() विधि के बारे में अधिक जानकारी , और ब्लॉग पोस्ट जिसने मुझे समाधान और एपीआई संदर्भ खोजने के लिए प्रेरित किया।


नोट: फ्लास्क डॉक्स पर उन run()तरीकों पर जो यह इंगित करते हैं कि उत्पादन पर्यावरण में इसका उपयोग करने से हतोत्साहित किया जाता है क्योंकि ( उद्धरण ): "जबकि हल्के और उपयोग में आसान है, फ्लास्क का अंतर्निहित सर्वर उत्पादन के लिए उपयुक्त नहीं है क्योंकि यह अच्छी तरह से पैमाने पर नहीं है। । "

हालांकि, वे उत्पादन के लिए जाते समय ऐसा करने के लिए अनुशंसित तरीकों के लिए अपने तैनाती विकल्प पृष्ठ को इंगित करते हैं।


5
जानकारी के लिए धन्यवाद। यह ध्यान रखना महत्वपूर्ण है कि रन के लिए डॉक्टर का कहना है कि इसका उपयोग उत्पादन वातावरण में नहीं किया जाना चाहिए, यह बताते हुए कि यह सुरक्षा या प्रदर्शन आवश्यकताओं को पूरा नहीं करता है।
कॉफी_फैन

1
@ कॉफ़ी_फैन आप सही हैं। यहां तक ​​कि नवीनतम 1.1.x पर वे इसे हतोत्साहित करते हैं, और इसके बजाय उत्पादन के लिए जाते समय परिनियोजन विकल्पों पर अपने पृष्ठ की जांच करने का सुझाव देते हैं । उत्तर में अपने मूल्यवान अवलोकन सहित :)
DarkCygnus

33

फ्लास्क एक ही समय में प्रति थ्रेड एक अनुरोध संसाधित करेगा। यदि आपके पास 4 थ्रेड्स के साथ 2 प्रक्रियाएं हैं, तो यह 8 समवर्ती अनुरोध हैं।

फ्लास्क धागे या प्रक्रियाओं को स्पॉन या प्रबंधित नहीं करता है। यह WSGI गेटवे (जैसे। gunicorn) की जिम्मेदारी है।


9

नहीं- आप निश्चित रूप से इससे अधिक संभाल सकते हैं।

यह याद रखना महत्वपूर्ण है कि गहरे नीचे, यह मानते हुए कि आप एक ही कोर मशीन चला रहे हैं, सीपीयू वास्तव में एक समय में केवल एक निर्देश * चलाता है।

अर्थात्, CPU केवल बहुत सीमित निर्देशों का निष्पादन कर सकता है, और यह प्रति घड़ी टिक से एक से अधिक निर्देशों को निष्पादित नहीं कर सकता है (कई निर्देश 1 से अधिक टिक भी लेते हैं)।

इसलिए, कंप्यूटर विज्ञान के बारे में हम बात करने वाले अधिकांश संगामिति सॉफ्टवेयर संगामिति हैं। दूसरे शब्दों में, सॉफ्टवेयर कार्यान्वयन की परतें हैं जो हमसे नीचे के स्तर सीपीयू को अमूर्त करती हैं और हमें लगता है कि हम कोड को समवर्ती रूप से चला रहे हैं।

ये "चीजें" प्रक्रियाएं हो सकती हैं, जो कोड की इकाइयां हैं जो इस अर्थ में समवर्ती रूप से चलती हैं कि प्रत्येक प्रक्रिया अपनी ही दुनिया में अपनी स्वयं की, गैर-साझा स्मृति के साथ चलने के बारे में सोचती है।

एक और उदाहरण थ्रेड्स हैं, जो कोड के अंदर की प्रक्रियाओं की इकाइयाँ हैं जो समरूपता की अनुमति देती हैं।

आपके 4 कार्यकर्ता प्रक्रियाओं को 4 से अधिक अनुरोधों को संभालने में सक्षम होने का कारण है कि वे अधिक से अधिक अनुरोधों को संभालने के लिए थ्रेड्स को बंद कर देंगे।

वास्तविक अनुरोध सीमा चुने गए HTTP सर्वर, I / O, OS, हार्डवेयर, नेटवर्क कनेक्शन आदि पर निर्भर करती है।

सौभाग्य!

* निर्देश सीपीयू चला सकते हैं बहुत ही मूल आदेश हैं। उदाहरण - दो नंबर जोड़ें, एक निर्देश से दूसरे में कूदें


1
क्या यह अंगारों या कुप्पी को कुतरना है? मैंने पाया कि कोई भी संभावना का समर्थन नहीं करता है।
जद।

1
निश्चित रूप से, मैं समझता हूं कि प्रक्रियाओं के बारे में, लेकिन जवाब में कहा गया है कि अधिक धागे जरूरत के अनुसार पैदा होते हैं। मैं यही चाहता हूं कि इसकी पुष्टि हो।
जद।

4
"गहरा गहरा नीचे, यह मानते हुए कि आप एक ही कोर मशीन चला रहे हैं, सीपीयू वास्तव में केवल एक ही समय में एक निर्देश * चलाता है" यह आधुनिक मशीनों पर सही नहीं है। अधिकांश आधुनिक सीपीयू पाइपलाइन और सुपरसेलकर हैं , जहां एक भी कोर में कई निष्पादन इकाइयां हैं और एक निर्देश डिकोडर है जो सॉफ्टवेयर साइड से देखे गए "मशीन कोड" को वास्तविक हार्डवेयर माइक्रो-ऑप्स में परिवर्तित करता है जो व्यक्तिगत निष्पादन इकाइयों में भेजे जाते हैं।
माइकल गेरी

1
स्पष्ट करने के लिए, दिन में वापस, सीपीयू ने वास्तव में संख्यात्मक निर्देशों को एक निष्पादन योग्य - मशीन कोड में सीधे निष्पादित किया। प्रत्येक सीपीयू संदर्भ में एक निर्देश टाइमिंग चार्ट होता था, जिसमें दिखाया जाता था कि प्रत्येक निर्देश कितने घड़ी चक्रों को शामिल करता है, जिसमें कोई मेमोरी संदर्भ भी शामिल है। इसलिए आप यह जान सकते हैं कि कोई भी कोड कितना समय लगेगा। आधुनिक सीपीयू ऐसे बिल्कुल नहीं हैं। एक दिलचस्प अपवाद बीगलबोन है जिसमें आधुनिक सुपरस्क्लेमर एआरएम प्रोसेसर और दो पुराने जमाने वाले "पीआरयू" प्रोसेसर हैं जो निश्चित निर्देश समय के साथ हैं।
माइकल गेरी

1
और यह स्पष्ट करने के लिए कि , जब मैंने "आधुनिक" कहा था, मैं इसे एआरएम / इंटेल / एएमडी चिप्स जैसे पिपेलिनेटेड, सुपरसेलर आदि प्रोसेसर के लिए एक ढीले शॉर्टहैंड के रूप में उपयोग कर रहा था, निश्चित रूप से आधुनिक प्रोसेसर भी हैं जो निश्चित समय के साथ पुराने तरीके से काम करते हैं। प्रति निर्देश, बीगलबोन पीआरयू जैसे मैंने उल्लेख किया और विभिन्न नए माइक्रोकंट्रोलर। (और अब Gunicorn पर वापस!)
माइकल गेरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.