2012-01-12 14 views

उत्तर

8

आप अपने Uwsgi अनुप्रयोग के लिए एक प्रबंधक के रूप में supervisord उपयोग करने का प्रयास कर सकता है। इसमें एक घड़ी का कार्य भी होता है जो एक फ़ाइल या फ़ोल्डर को "स्पर्श"/संशोधित किया गया है जब एक प्रक्रिया को स्वत: पुनः लोड करता है।

आप यहाँ एक अच्छा ट्यूटोरियल मिलेगा: Flask+NginX+Uwsgi+Supervisord

+0

लिंक अब उपलब्ध नहीं है – ricosrealm

-3

मुझे डर है कि फ्लास्क वास्तव में बहुत ही बेकार हड्डियों को कार्यान्वित करने के लिए डिफ़ॉल्ट रूप से इस तरह के कार्यान्वयन के लिए है।

गतिशील रूप से पुन: लोड उत्पादन में कोड आम तौर पर एक बुरी बात है, लेकिन अगर आप एक देव पर्यावरण के बारे में चिंतित हैं, इस bash खोल स्क्रिप्ट पर एक नज़र डालें http://aplawrence.com/Unixart/watchdir.html

बस नींद अंतराल जो कुछ भी करने के लिए अपनी आवश्यकताओं और विकल्प सूट बदलने uwsgi को पुनः लोड करने के लिए जो भी आप उपयोग करते हैं, उसके साथ echo कमांड। मैं uwsgi un मास्टर मोड चलाता हूं और बस एक killall uwsgi कमांड भेजता हूं।

5

विकास-मोड फ्लास्क की ऑटो-रीलोडिंग कार्यक्षमता वास्तव में अंतर्निहित वर्कज़ग लाइब्रेरी द्वारा प्रदान की जाती है। प्रासंगिक कोड werkzeug/serving.py में है - इसे देखने के लायक है। लेकिन मूल रूप से, मुख्य अनुप्रयोग WSGI सर्वर को एक उपप्रोसेस के रूप में उत्पन्न करता है जो प्रत्येक सक्रिय .py प्रति सेकंड एक बार फ़ाइल को बदलता है, परिवर्तनों की तलाश करता है। यदि यह किसी को देखता है, तो सबप्रोसेस निकलता है, और अभिभावक प्रक्रिया इसे फिर से शुरू करती है - असल में पिंजरों को फिर से लोड करना।

कोई कारण नहीं है कि आप uWSGI की परत पर एक समान तकनीक को लागू नहीं कर पाएंगे। यदि आप एक स्टेट लूप का उपयोग नहीं करना चाहते हैं, तो आप अंतर्निहित ओएस फ़ाइल-घड़ी कमांड का उपयोग करने का प्रयास कर सकते हैं। जाहिर है (वेर्कज़ुग के कोड के अनुसार), pyinotify छोटी गाड़ी है, लेकिन शायद Watchdog काम करता है? कुछ चीजों को आज़माएं और देखें कि क्या होता है।

संपादित करें:

टिप्पणी के जवाब में, मुझे लगता है कि इस reimplement लिए बहुत आसान हो जाएगा। werkzeug/serving.py से, आपके लिंक से प्रदान उदाहरण पर बिल्डिंग कोड के साथ:

""" NOTE: _iter_module_files() and check_for_modifications() are both 
    copied from Werkzeug code. Include appropriate attribution if 
    actually used in a project. """ 
import uwsgi 
from uwsgidecorators import timer 

import sys 
import os 

def _iter_module_files(): 
    for module in sys.modules.values(): 
     filename = getattr(module, '__file__', None) 
     if filename: 
      old = None 
      while not os.path.isfile(filename): 
       old = filename 
       filename = os.path.dirname(filename) 
       if filename == old: 
        break 
      else: 
       if filename[-4:] in ('.pyc', '.pyo'): 
        filename = filename[:-1] 
       yield filename 

@timer(3) 
def check_for_modifications(): 
    # Function-static variable... you could make this global, or whatever 
    mtimes = check_for_modifications.mtimes 
    for filename in _iter_module_files(): 
     try: 
      mtime = os.stat(filename).st_mtime 
     except OSError: 
      continue 

     old_time = mtimes.get(filename) 
     if old_time is None: 
      mtimes[filename] = mtime 
      continue 
     elif mtime > old_time: 
      uwsgi.reload() 
      return 

check_for_modifications.mtimes = {} # init static 

यह untested है, लेकिन काम करना चाहिए।

+0

युक्तियों के लिए धन्यवाद! मैंने werkzeug.serving के माध्यम से थोड़ा सा देखा था, लेकिन उम्मीद थी कि मैं जल्दी से पूछने के लिए अपने हाथ गंदे होने से बच सकता हूं ... हो सकता है कि यह किसी के समय लागू हो। :) – Florian

-1
import gevent.wsgi 
import werkzeug.serving 

@werkzeug.serving.run_with_reloader 
def runServer(): 
    gevent.wsgi.WSGIServer(('', 5000), app).serve_forever() 

(आप एक मनमाना WSGI सर्वर का उपयोग कर सकते हैं)

+3

दुर्भाग्यवश यह मेरे प्रश्न का उत्तर नहीं है। मैं सेवा करने के लिए uwsgi चाहता हूँ। बीटीडब्ल्यू: फ्लास्क का app.run (डीबग = ट्रू) बॉक्स से पुनः लोडिंग प्रदान करता है। – Florian

+0

हालांकि देव। फ्लास्क के साथ भेजे गए वेबसर्वर को पुनः लोड करने की सुविधा मिलती है, यह डिबगिंग के लिए एक खोल भी प्रदान करता है! आप उत्पादन में हर किसी के लिए एक अजगर खोल नहीं देना चाहते हैं! – Jabba

12

विकास के वातावरण के लिए आप --python-autoreload uwsgi के पैरामीटर का उपयोग करने की कोशिश कर सकते हैं। स्रोत कोड को देखते हुए यह केवल थ्रेडेड मोड (--enable-threads) में काम कर सकता है।

+6

यह मेरे लिए काम करता है। मेरी 'uwsgi.ini' फ़ाइल में' पायथन-ऑटोरेलोड = 1' जोड़ना इसे पुनः लोड करने के लिए मिलता है! धन्यवाद! – JoshFinnie

+1

uwsgi सम्राट मोड का उपयोग करना - यह ऐप के आईएनआई में जोड़कर काम करता है। धन्यवाद! –

+1

मुझे लगता है कि यह ध्यान देने योग्य है कि मान '1' और' true' * * अदला-बदले नहीं हैं। केवल '1' मेरे लिए काम करता है। – kungphu

37

मैं uwsgi संस्करण 1.9 चला रहा हूं।5 और विकल्प

uwsgi --py-autoreload 1 

काम करता है महान

+1

अच्छी पकड़। --help आउटपुट में सूचीबद्ध नहीं है। धन्यवाद! – user237419

+1

uwsgi सम्राट मोड का उपयोग, सम्राट प्रक्रिया लॉन्च और न ही व्यक्तिगत ऐप इनआई कॉन्फ़िगरेशन के लिए काम करता है। पूर्व "अज्ञात विकल्प" देता है, बाद में कुछ भी नहीं देता है। किसी भी तरह से, प्रक्रियाओं को ध्यान में रखे जाने के लिए प्रक्रिया को पुनरारंभ करना होगा ... –

+0

मैं uwsgi --py-autoreload 1 कैसे चला सकता हूं – Burf2000

5

आप आदेश तर्क के साथ uwsgi को विन्यस्त कर रहे हैं, पारित --py-autoreload=1: आप uwsgi कॉन्फ़िगर करने के लिए एक .ini फ़ाइल का उपयोग और उपयोग कर रहे हैं

uwsgi --py-autoreload=1 

uwsgi --ini, अपनी .ini फ़ाइल में निम्न जोड़ें:

py-autoreload = 1 
संबंधित मुद्दे