2012-10-25 19 views
5

हम के रूप मेंक्या django + mod_wsgi थ्रेडेड प्रोग्रामिंग अनुशासन की आवश्यकता है?

`WSGIDaemonProcess our-appname processes=6 threads=15'` 

mod_wsgi के तहत हमारी पहली Django आवेदन बाहर चल रहे हैं और हम के बारे में चर्चा हो रही हो, क्या हमारे अजगर कोड और यह जरूरतों का उपयोग करता धागा सुरक्षित है या नहीं होने के लिए Redis और Postgres पुस्तकालयों।

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

हम नहीं हमारे अजगर कोड में धागे के साथ स्पष्ट रूप से कुछ भी कर रहे हैं, वहाँ कुछ भी हम लिखा है में उन्हें का कोई जिक्र नहीं है।

लेकिन यहाँ कुछ लोगों की राय है कि हम threads=15 कि हम मल्टी-थ्रेडेड दुनिया में में अब कर रहे हैं के साथ चला रहे हैं के बाद से की है।

क्या कोई यह स्पष्ट कर सकता है कि वास्तव में यहां क्या चल रहा है? क्या हमारा पायथन कोड अब उसी डेटा के माध्यम से निष्पादन के कई धागे के अधीन है जहां यह पहले नहीं था, या नहीं?

उत्तर

6

हाँ जाहिर है आप मल्टी-थ्रेडेड अनुप्रयोग चल रहे हैं और यह समस्या पैदा करेगा अगर आप वैश्विक साथ देखभाल नहीं करते हैं, कक्षा विशेषताओं आदि

आप कुछ विश्व स्तर पर रखने के लिए, धागा स्थानीय भंडारण में रखने की जरूरत है।

यहाँ modwsgi doc, Building_A_Portable_Application

3 से एक उद्धरण है। एक आवेदन फिर से प्रवेश किया जाना चाहिए, या बस, एक ही समय में एकाधिक धागे द्वारा समवर्ती रूप से कहा जा सकता है। डाटा जो अनुरोध के जीवन के लिए मौजूद हैं की जरूरत है,, ढेर आधारित डेटा के रूप में जमा करने की आवश्यकता स्थानीय डेटा थ्रेड, या WSGI आवेदन वातावरण में कैश की गई हैं। इस उद्देश्य के लिए वास्तविक अनुप्रयोग मॉड्यूल के भीतर वैश्विक चर का उपयोग नहीं किया जा सकता है।

तो मैं आप पर्याप्त रूप से चेतावनी दी गई है लगता है।

0

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

कुछ वेबसर्वर जैसे कि ग्वेन्ट बैकर के साथ गनिकोर्न में स्मृति में कई धागे होंगे, ताकि I/O (डेटाबेस एक्सेस, नेटवर्क एक्सेस इत्यादि) पर किसी भी व्यक्तिगत प्रक्रिया को अवरुद्ध करने की आवश्यकता न हो। यह mod_wsgi के साथ भी मामला हो सकता है। हालांकि, इसे इस तरह लागू किया गया है कि आपको अपने आवेदन कोड में इसके बारे में चिंता करने की आवश्यकता नहीं है - यदि आपका आवेदन मल्टीप्रोसेसिंग में उपयोग करने के लिए सुरक्षित है, तो इस प्रकार के सीमित गैर-समवर्ती थ्रेडिंग में उपयोग करना सुरक्षित होना चाहिए आदर्श।

बेशक, आप वैश्विक चर का उपयोग नहीं कर सकते हैं या अपने आवेदन के कुछ हिस्सों को गतिशील रूप से संपादित नहीं कर सकते हैं, लेकिन यदि आप Django में ऐसा कुछ भी कर रहे हैं तो आपको थ्रेडिंग के बारे में चिंता करने से पहले भी समस्याएं आती हैं। Django और अन्य वेब ढांचे को डिज़ाइन किया गया है ताकि डेटा उस मॉडल के भीतर थ्रेड/प्रोसेस सुरक्षा के बारे में चिंता किए बिना अनुरोध के रूप में और प्रतिक्रिया के रूप में पारित किया जा सके।

आपको किसी भी वेब एप्लिकेशन के लिए डेटा स्टोर (एसएसपी डेटाबेस प्रविष्टियों) के समवर्ती उपयोग के बारे में चिंता करने की आवश्यकता है। जब डेटाबेस पहुंच की बात आती है तो कोड रक्षात्मक रूप से कोड।

+1

क्षमा करें, लेकिन मुझे वाक्यांश में आपका अग्रणी बहुत भ्रमित लगता है। पाइथन दुभाषिया स्वयं धागा सुरक्षित है, अगर ऐसा नहीं होता तो यह पूरे स्थान पर दुर्घटनाग्रस्त हो जाएगा। संदर्भ गणनाओं के पाइथन दुभाषिया और प्रबंधन की आंतरिक स्थिति जीआईएल द्वारा मध्यस्थ होती है जैसा कि आप कहते हैं और यह सुनिश्चित करता है कि पाइथन दुभाषिया का उपयोग कई धागे के साथ सुरक्षित है। इसे समझाने का इतना बुरा तरीका। गीवेन्ट के साथ गनिकोर्न में कई धागे नहीं हैं। Gevent का उपयोग करते समय वे तकनीकी रूप से coroutines धागे नहीं हैं हालांकि यह उन्हें धागे की तरह दिखता है। –

+1

अब आवेदन स्तर कोड थ्रेड सुरक्षित होने का मुद्दा एक अलग मुद्दा है, लेकिन इस बात को भ्रमित न करें कि पाइथन दुभाषिया थ्रेड सुरक्षित है या नहीं। –

+0

पहली गिनती पर, मुझे लगता है कि यह सच है, हालांकि मुझे यकीन नहीं है कि यह पाइथन दुभाषिया का वर्णन करने के लिए कम सटीक है क्योंकि पाइथन ऑब्जेक्ट्स पर मेमोरी ऑपरेशंस के लिए थ्रेड सुरक्षित नहीं है, यह समझा जाता है कि यह थ्रेड सुरक्षित है क्योंकि जीआईएल धागे को ऊपर से करने से रोकता है। दूसरी गिनती पर, मैं सहमत हूं; gevent "हरी धागे" का उपयोग करता है जो तकनीकी रूप से धागे नहीं हैं - मुझे यह समझा जाना चाहिए था। –

1

मुझे लगता है कि एंड्रयू का जवाब थोड़ा भ्रामक है। तथ्य यह है कि सीपीथॉन (ध्यान दें कि ज्योथन और पायपी जैसे अन्य पायथन कार्यान्वयन हैं) जीआईएल का मतलब यह नहीं है कि आपको अपने कोड को थ्रेड सुरक्षित होने की चिंता करने की ज़रूरत नहीं है! जीआईएल की वजह से, एक ही प्रक्रिया में कोई भी दो धागे एक ही समय में सक्रिय नहीं हो सकते हैं। लेकिन समांतरता थ्रेड के बीच समय-समय पर स्विच करके अनुकरण की जाती है। और इस तरह के एक संदर्भ स्विच किसी भी समय आपके कार्यक्रम के निष्पादन के दौरान हो सकता है। उदाहरण के लिए, यदि आप एक मॉड्यूल foo युक्त है, तो "वैश्विक" चर x, तो निम्न विधि हो सकता है उत्पादन कुछ भी से 2, 3, 4, ..., को क्रियान्वित करने कि एक ही विधि धागे की संख्या के आधार पर:

def bar(): 
    foo.x = 1 
    # a context switch might happen here! 
    foo.x = foo.x + 1 
    # or here! 
    print(foo.x) 

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

संबंधित मुद्दे