2011-06-30 12 views
14

मैं अपाचे के माध्यम से एक django साइट की सेवा के लिए mod_wsgi का उपयोग कर रहा हूं। मेरे पास कुछ पायथन कोड भी है जो पृष्ठभूमि प्रक्रिया के रूप में चलता है (डेमॉन?)। यह एक सर्वर को मतदान करता रहता है और डेटा को Django मॉडल में से एक में डालता है। यह ठीक काम करता है लेकिन क्या यह कोड मेरे Django एप्लिकेशन का हिस्सा हो सकता है और फिर भी पृष्ठभूमि में लगातार चलने में सक्षम है? इसे प्रति प्रक्रिया एक प्रक्रिया की आवश्यकता नहीं है, लेकिन Django साइट की एक कला जो लगातार सक्रिय है। यदि हां, तो क्या आप मुझे एक उदाहरण या कुछ दस्तावेज पर इंगित कर सकते हैं जो मुझे इसे पूरा करने में मदद करेगा?क्या मेरे पास Django के अंदर लगातार कुछ कोड चल सकता है जैसे कि डिमन

धन्यवाद। (जो काफी आसान है वास्तव में) और अधिक उन्नत और शायद सिफारिश की विधि, एकीकृत अपनी परियोजना में celery -

उत्तर

14

आप या तो एक क्रॉन जॉब कुछ समारोह आप परिभाषित किया है, या चलाता है कि सेट कर सकते हैं।

+0

मैं सेलेरी के साथ गया। एक जादू की तरह काम किया। –

+0

एक क्रॉन कार्य लगातार पृष्ठभूमि में नहीं चलता है, लेकिन तैयार समय पर शुरू होता है और समाप्त होता है। चूंकि डीजेंगो-कमांड शुरू करने के लिए 1.5 सेकंड्स (मॉडलों की जटिलता को छोड़कर) लेते हैं, इसलिए उच्च प्रदर्शन की आवश्यकता होने पर आमतौर पर ऐसा करने का तरीका नहीं होता है। – FeedTheWeb

+0

क्या यह अभी भी वैध है? यदि हां, तो सेलेरी कार्य को खत्म करने का एक अच्छा तरीका क्या होगा जो मेरी लंबी प्रसंस्करण करेगा? –

9

जब आप पहली बार आयात किया जा रहा है तो आप WSGI स्क्रिप्ट से पृष्ठभूमि थ्रेड बना सकते हैं।

import threading 
import time 

def do_stuff(): 
    time.sleep(60) 
    ... do periodic job 

_thread = threading.Thread(target=do_stuff) 
_thread.setDaemon(True) 
_thread.start() 

इसके लिए काम करने के लिए, हालांकि आप केवल एक डेमॉन प्रक्रिया का उपयोग करने की अन्यथा प्रत्येक प्रक्रिया एक ही बात है जो शायद आप नहीं चाहते कर रहे होते होगा।

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

आप होने से ऐसा कर सकते हैं:

WSGIDaemonProcess django-jobs processes=1 threads=1 
WSGIImportScript /usr/local/django/mysite/apache/django.wsgi \ 
    process-group=django-jobs application-group=%{GLOBAL} 

WSGIImportScript निर्देश है कि स्क्रिप्ट लोड और प्रक्रिया समूह 'Django-जॉब' के संदर्भ में स्टार्टअप पर इसे चलाने के लिए कहते हैं।

एकाधिक स्क्रिप्ट्स को सहेजने के लिए, मैंने यह इंगित किया है कि आपकी मूल WSGI स्क्रिप्ट फ़ाइल क्या होगी जिसे आपने WSGIScriptAlias ​​के लिए उपयोग किया था। हम इसे जब यह कि हालांकि निर्देश से भरी हुई है चलाने के लिए नहीं करना चाहते हैं, तो हम कार्य करें:

import mod_wsgi 

if mod_wsgi.process_group == 'django-jobs': 
    _thread = threading.Thread(target=do_stuff) 
    _thread.setDaemon(True) 
    _thread.start() 
यहाँ

यह डेमॉन प्रक्रिया समूह का नाम पर लग रहा है और केवल जब विशेष डेमॉन प्रक्रिया के भीतर शुरू चलाता है इस के लिए एकल प्रक्रिया के साथ समूह स्थापित।

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

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

WSGIDaemonProcess django-jobs processes=1 threads=1 
WSGIImportScript /usr/local/django/mysite/apache/django.wsgi \ 
    process-group=django-jobs application-group=%{GLOBAL} 

WSGIDaemonProcess django-site processes=4 threads=5 
WSGIScriptAlias//usr/local/django/mysite/apache/django.wsgi 

WSGIProcessGroup django-site 
WSGIApplicationGroup %{GLOBAL} 

<Location /admin> 
WSGIProcessGroup django-jobs 
</Location> 

यहाँ, 'Django-जॉब' में 'Django साइट' में/व्यवस्थापक रन के तहत सामान,/व्यवस्थापक के साथ के लिए छोड़कर सभी URL।

वैसे भी, यह अपाचे mod_wsgi डिमन प्रक्रिया के भीतर अनुरोध करने के विशिष्ट प्रश्न को संबोधित करता है।

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

+0

+1 slick मुझे नहीं पता था mod_wsgi के लिए इसका जवाब था। –

+0

यदि आप गनिकॉर्न का उपयोग कर रहे हैं, तो आप गनिकॉर्न के 'when_ready' फ़ंक्शन को ओवरराइड करके एक नया धागा शुरू कर सकते हैं। यहां एक उदाहरण दिया गया है: https://github.com/benoitc/gunicorn/blob/master/examples/example_config.py –

+0

स्मृति से, 'an_ready'' बंदूकधारी माता-पिता प्रक्रिया में चलता है। आमतौर पर ऐसी माता-पिता प्रक्रिया में लंबे समय तक चलने वाली सामग्री करने का अच्छा विचार नहीं है। उस मूल प्रक्रिया को कार्यकर्ता प्रक्रिया बनने के लिए मजबूर किया जाएगा और आपके पृष्ठभूमि धागे के कारण किसी भी राज्य को विरासत में लाने से प्रभाव हो सकते हैं, भले ही पृष्ठभूमि धागा स्वयं कांटा से बच न सके। –

0

मैंने पहले एक क्रॉन नौकरी का उपयोग किया था, लेकिन मैं आपको बता रहा हूं, आप थोड़ी देर बाद अजवाइन पर स्विच करेंगे।

सेलेरी जाने का रास्ता है। इसके अलावा आप लंबे एसिंक प्रक्रिया को कार्य कर सकते हैं ताकि आप अनुरोध/प्रतिक्रिया समय को तेज कर सकें।

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