वैश्विक अनुरोध संदर्भ - प्रतिमान?


12

मैं आज पाइथन वेब फ्रेमवर्क और उनके बारे में हमारे छापों के बारे में अपने एक सहयोगी से बात कर रहा था। मैंने उससे कहा कि मुझे लगता है कि फ्लास्क का वैश्विक अनुरोध बुरी तरह से बदबू आ रहा है और यह एक विरोधी पैटर्न है।

डॉक्स अनुरोध संदर्भ के बारे में कहते हैं:

इसके विपरीत, अनुरोध से निपटने के दौरान, कुछ अन्य नियम मौजूद हैं:

  • एक अनुरोध सक्रिय है, संदर्भ स्थानीय वस्तुओं (फ्लास्क.क्रेस्ट और अन्य) वर्तमान अनुरोध को इंगित करता है।
  • कोई भी कोड किसी भी समय इन वस्तुओं को पकड़ सकता है।

मुझे लगता है कि मैं इस डिजाइन निर्णय के पीछे के विचार को समझता हूं - आवेदन को सरल बनाने के लिए। यह सिर्फ एक समझौता है, जैसे थ्रेड लोकल के मामले में :

हां, थ्रेड लोकल का उपयोग करने के लिए यह आमतौर पर ऐसा उज्ज्वल विचार नहीं है। वे उन सर्वरों के लिए परेशानी का कारण बनते हैं जो थ्रेड की अवधारणा पर आधारित नहीं हैं और बड़े अनुप्रयोगों को बनाए रखने के लिए कठिन बनाते हैं। हालाँकि फ्लास्क सिर्फ बड़े अनुप्रयोगों या अतुल्यकालिक सर्वरों के लिए नहीं बनाया गया है। फ्लास्क एक पारंपरिक वेब एप्लिकेशन लिखना त्वरित और आसान बनाना चाहते हैं।

क्या वर्तमान अनुरोध जानकारी के साथ एक वैश्विक वस्तु को पैच करना एक विरोधी पैटर्न है?

मेरा मानना ​​है कि यह एक वैश्विक राज्य के स्थिर कोड विश्लेषक के विचार में है, हालांकि यह नहीं है। और मैं एक प्रोग्रामर के रूप में समझ नहीं पाऊंगा कि डॉक्स को ध्यान से पढ़े बिना यह कैसे काम करता है । और यह परीक्षण पर परिणाम है

क्या विचारों के तर्क के रूप में अनुरोध पारित करना एक अच्छा अभ्यास नहीं है? मुझे लगता है कि यह अधिक पठनीय, स्पष्ट और डिबग करने में आसान है। और वैश्विक स्थिति से बचा जाता है।


2
आपने वास्तव में यह नहीं कहा है कि इस तरह के एंटीपार्टर्न के विशिष्ट नकारात्मक प्रभाव क्या हो सकते हैं। मैं व्यापक सामान्यताओं का अविश्वास करता हूं जिनका कोई तथ्यात्मक आधार नहीं है।
रॉबर्ट हार्वे

2
अच्छा सवाल है, लेकिन दुख की बात है कि कई गुणवत्ता के जवाब नहीं
स्लीपाइकल

जवाबों:


4

कई वेब फ्रेमवर्क में यही संरचना है: एक वैश्विक अनुरोध। एक मायने में, यह सही बात है क्योंकि हे, वास्तव में एक समय में केवल एक ही अनुरोध है।

तो क्या पैरामीटर के रूप में अनुरोध को पारित करने का कोई मतलब है? नहीं। अनुरोध अनुरोध है, और पैरामीटर अलग-अलग समय में अलग-अलग चीजों में पारित करने के लिए हैं।

असली समस्या आता है के रूप में आप एक बड़ा आवेदन के निचले स्तर पर विचार करने लगते हैं। वैश्विक अनुरोध के साथ सभी जगह कोड लिखने का प्रलोभन है जो वैश्विक स्तर पर अनुरोध तक पहुंचता है। यह बहुत बुरी बात है । यह कोड के विभिन्न भागों के बीच युग्मन का उत्पादन करता है, चीजों को बदलना कठिन बनाता है और चीजों को परखना कठिन बनाता है।

तो मेरा जवाब है: वैश्विक अनुरोध रखें और इसके साथ रहें। हालांकि, जहां भी एक व्यक्तिगत मॉड्यूल या फ़ंक्शन को पूरे अनुरोध की आवश्यकता नहीं है, केवल एक पैरामीटर के रूप में आवश्यक डेटा को पास करें। बस रेफरर, या url, या कमांड टेल और जो भी बिट्स की जरूरत है उसे अपने कार्यों में पास करें। यह कोड मॉड्यूलर रखने, युग्मन को कम करने और परीक्षण क्षमता में सुधार करने में मदद करेगा।

छोटे कार्यक्रमों के लिए यह बहुत मायने रखता है, लेकिन बड़े लोगों के लिए यह एक वास्तविक जीवनरक्षक हो सकता है।


3

(मैं बोल्ड होने जा रहा हूं और इसका उत्तर दूंगा, हालांकि मुझे कुछ गिरावट आ सकती है।)

फ्लास्क एक माइक्रो-फ्रेमवर्क है; आप तामझाम छोड़ते समय सादगी से लाभ उठाते हैं। जबकि एक आंत स्तर पर मैं आपसे सहमत हूं, मुझे पता है कि मैंने एक दुकान पर फ्लास्क + गिकॉर्न का इस्तेमाल किया, जिससे मुझे मल्टी-थ्रेडिंग की ज़रूरत थी। यह वास्तव में अच्छी तरह से काम किया । स्क्रिप्ट के प्रत्येक उदाहरण ने केवल एक अनुरोध (यानी एक धागा) दिया, और gunicorn ने कई थ्रेड्स के बीच "फैन आउट" को संभाला। यह उस पर बहुत अच्छा लगा।

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

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

यह मेरे लिए अजीब था कि एक धागा मेरी स्क्रिप्ट के एक आह्वान को संभाल लेगा, लेकिन एक ही समय में एक बॉक्स पर कुछ दर्जन चलने के बाद, मुझे इसके बारे में बेहतर महसूस हुआ।


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

2

पायथन में आपके पास printकमांड (v3 से फ़ंक्शन) है जो मानक आउटपुट पर प्रिंट करता है। आप स्पष्ट रूप से निर्दिष्ट नहीं करते हैं कि आप STDOUT पर प्रिंट करना चाहते हैं - यह आपके लिए पर्दे के पीछे किया गया है।

परोक्ष। अजगर में। और किसी को भी इससे कोई समस्या नहीं है। क्यों?

printपायथन भाषा का हिस्सा है, और पायथन में प्रोग्रामिंग की एक आवश्यकता है ... अच्छी तरह से ... पायथन को जानना। और यदि आप पायथन को जानते हैं, तो आप जानते हैं कि printSTDOUT को लक्षित करता है। कोई आश्चर्य नहीं।

पायथन - एक भाषा के रूप में - यह स्वयं के सम्मेलन को परिभाषित कर सकता है और मान सकता है कि प्रोग्रामर उनके बारे में जानते हैं।

फ्रेमवर्क भी उस विशेषाधिकार का आनंद लेते हैं - यह एक फ्रेमवर्क और लाइब्रेरी के बीच महत्वपूर्ण अंतर में से एक है। इसका उपयोग करने के लिए आपको कोई लाइब्रेरी नहीं सीखनी पड़ेगी - आपको बस एपीआई के उस हिस्से को ढूंढना होगा, जिसकी आपको जरूरत है, और यह मान लें कि यह भाषा (या फ्रेमवर्क) की परंपराओं का पालन करता है। यही कारण है कि आपको जीएसओएन या अपाचे कॉमन्स में ज्ञान प्राप्त करने वाले लोगों की तलाश नहीं है। लेकिन आप रिक्रूटर्स को JQuery या Ruby ऑन रेल्स या ASP.NET MVC के अनुभव वाले लोगों की तलाश करते हुए देखते हैं - क्योंकि वे फ्रेमवर्क हैं जो अपने स्वयं के सम्मेलनों को परिभाषित करते हैं जिन्हें आपको सीखना और जागरूक होना चाहिए।

फ्लास्क, एक फ्रेमवर्क के रूप में, एक सूत्र-स्थानीय वैश्विक में संदर्भ को संग्रहीत करने के लिए एक सम्मेलन को परिभाषित कर सकता है - और यह किसी को आश्चर्यचकित नहीं करना चाहिए, इसलिए यह एक विरोधी पैटर्न नहीं है।


2
ध्यान दें कि "stdout" का अर्थ है कि जो भी फ़ाइल डिस्क्रिप्टर द्वारा इंगित किया गया है sys.stdout। यदि आप इसे बदलते हैं, तो प्रिंट कहीं और जाता है।
फ़ोशी

1
इसके अलावा, आप Python3 में कार्य करने के लिए >>ऑपरेटर या पासिंग fileतर्क का उपयोग करके आउटपुट स्ट्रीम को ओवरराइड कर सकते हैं print। तो, sys.stdoutबस एक डिफ़ॉल्ट मूल्य है जिसे ओवरराइड किया जा सकता है।
वार्वारियुक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.