2010-06-29 12 views
5

में subprocess.Popen() का उपयोग कर एक पायथन स्क्रिप्ट निष्पादित करना मैंने थोड़ा सा देखा है लेकिन मुझे लगता है कि मैं इस समस्या को हल नहीं कर सकता। मैं अपने django ऐप के दृश्य में एक पायथन लिपि निष्पादित करना चाहता हूं। मैंने कोड को रखा है जिसे मैं django प्रबंधन कमांड के अंदर निष्पादित करना चाहता हूं ताकि इसे कमांड लाइन python manage.py command-name के माध्यम से एक्सेस किया जा सके। मैंने फिर subprocess.Popen("python manage.py command-name",shell=True) का उपयोग करके इस कमांड को चलाने का प्रयास किया।एक django दृश्य

हालांकि, इस आदेश को निष्पादित करने में कुछ समय लग सकता है, इसलिए मैं दृश्य को जारी रखना चाहता हूं और स्क्रिप्ट को पृष्ठभूमि में निष्पादित करने की अनुमति देता हूं। का उपयोग करते हुए subprocess.Popen अकेले जब तक स्क्रिप्ट समाप्त हो गया है लटका दृश्य पैदा कर रहा है, तो मैं एक धागा (another एसए सवाल के बाद) उपयोग करने की कोशिश:

class SubprocessThread(threading.Thread): 
def __init__(self, c): 
    self.command = c 
    self.stdout = None 
    self.stderr = None 
    threading.Thread.__init__(self) 

def run(self): 
    p = subprocess.Popen(self.command, 
         shell=True, 
         stdout=subprocess.PIPE, 
         stderr=subprocess.PIPE) 

    self.stdout, self.stderr = p.communicate() 

और फिर इसे क्रियान्वित:

t = SubprocessThread("python manage.py command-name") 
t.setDaemon(True) 
t.start() 
t.join() 

हालांकि, दृश्य अभी भी लटकता है: कर्सर में एक व्यस्त प्रतीक है और पृष्ठ पर AJAX लोड नहीं होता है। अन्यथा पृष्ठ का एचटीएमएल सामान्य रूप से समाप्त होने के बाद (स्क्रिप्ट खत्म होने से पहले) थ्रेड कॉल के बाद दृश्य में ठीक और कमांड को लोड करने लगता है। क्या कोई मेरी सहायता कर सकता है? मैं स्क्रिप्ट को निष्पादित करना चाहता हूं और पृष्ठ पर दृश्य या AJAX कॉल किए बिना अपनी खुद की चीज़ करना चाहता हूं।

+0

मैं नियमित रूप से (एक 'subprocess' साथ क्योंकि एक' thread' मार दिया जाता है जब दृश्य समारोह बाहर निकलता है) एक समान पैटर्न का उपयोग, और मैं नियमित रूप से कुछ वापस जाने के लिए भूल जाते हैं ब्राउज़र को लटकाने, फ़ंक्शन देखें। फिर, मैं subporcess को दोषी ठहराता हूं, जबकि मैं सिर्फ 'HttpResponse' वापस करने के लिए भूल गया था। जांच करे! – Dunatotatos

उत्तर

3

शायद तुम का उपयोग करना चाहिए celery

अजवाइन एक कार्य कतार/काम वितरित संदेश गुजर के आधार पर कतार है। यह वास्तविक समय आपरेशन पर केंद्रित है

1

मैंने कुछ ऐसा करने के लिए बहुत समय बर्बाद कर दिया, लेकिन आपके जैसी ही समस्याएं थीं। आखिरकार, मैंने काम को संभालने के लिए एक बीनस्टॉक कतार छोड़ दी और लागू किया।

http://kr.github.com/beanstalkd/

मैं Django दृश्य में कतार पर एक आईडी डाल दिया, और उसके बाद उपभोक्ता (supervisord ने देखा) को चलाने के लिए एक प्रबंधन आदेश दिया है।

कतार का उपयोग करने का अर्थ है कि आप कई उपभोक्ताओं तक विस्तार कर सकते हैं, और लोड को बेहतर तरीके से प्रबंधित करने की अनुमति देता है (यदि आवश्यक हो तो काम करने के बिना उपभोक्ता को रोकना)।

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