2012-01-12 16 views

risposta

8

Si potrebbe provare a utilizzare supervisord come manager per il vostro Uwsgi app. Ha anche una funzione orologio che ricarica automaticamente un processo quando un file o una cartella sono stati "toccati"/modificati.

Troverete un bel tutorial qui: Flask+NginX+Uwsgi+Supervisord

+0

Il link non è più disponibile – ricosrealm

-3

Temo che Flask sia davvero troppo semplice per avere un'implementazione di questo tipo in bundle di default.

dinamicamente ricaricando codice di produzione è generalmente una brutta cosa, ma se siete preoccupati per un ambiente dev, date un'occhiata a questo script shell bash http://aplawrence.com/Unixart/watchdir.html

basta cambiare l'intervallo di sonno a tutto ciò che si adatta alle vostre esigenze e sostituto il comando echo con qualsiasi cosa tu usi per ricaricare uwsgi. Corro uwsgi un master mode e mando solo un killall uwsgi.

5

La funzionalità di ricaricamento automatico di Flask in modalità sviluppo è effettivamente fornita dalla libreria di Werkzeug sottostante. Il codice relativo è in werkzeug/serving.py - vale la pena dare un'occhiata. Ma fondamentalmente, l'applicazione principale genera il server WSGI come un sottoprocesso che riporta ogni file attivo .py una volta al secondo, cercando le modifiche. Se ne rileva uno, il sottoprocesso viene chiuso e il processo padre lo riavvia nuovamente, in pratica ricaricando le chages.

Non c'è motivo per cui non sia possibile implementare una tecnica simile a livello di uWSGI. Se non si desidera utilizzare un ciclo di statistiche, è possibile provare a utilizzare i comandi di visualizzazione dei file OS di base. Apparentemente (secondo il codice di Werkzeug), pyinotify è bacato, ma forse Watchdog funziona? Prova alcune cose e vedi cosa succede.

Edit:

In risposta al commento, credo che questo sarebbe abbastanza facile da reimplementare. Sulla base l'esempio fornito dal tuo link, insieme al codice da 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 

E 'testato, ma dovrebbe funzionare.

+0

Grazie per i suggerimenti! Avevo guardato un po 'attraverso werkzeug.serving, ma speravo di poter evitare di sporcarmi le mani, chiedendo una soluzione rapida ... forse è ora che qualcuno la implementa. :) – Florian

-1
import gevent.wsgi 
import werkzeug.serving 

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

(È possibile utilizzare un server WSGI arbitrario)

+3

Purtroppo questa non è una risposta alla mia domanda. Voglio che uwsgi faccia il servizio. btw: Flask's app.run (debug = True) fornisce il ricaricamento immediato. – Florian

+0

Sebbene il dev. Il webserver fornito con Flask fornisce il ricaricamento, fornisce anche una shell per il debugging! Non vuoi dare una shell python a tutti in produzione! – Jabba

12

Per ambiente di sviluppo si può provare a utilizzare il parametro --python-autoreload di uwsgi. Guardando il codice sorgente può funzionare solo in modalità thread (--enable-threads).

+6

Questo ha funzionato per me. Aggiungendo 'python-autoreload = 1' al mio file' uwsgi.ini' si ottiene il caricamento! Grazie! – JoshFinnie

+1

Uso della modalità imperial di uwsgi: questo ha funzionato aggiungendo all'i ini dell'applicazione. Grazie! –

+1

Penso che valga la pena notare che i valori '1' e' true' sono * non * intercambiabili qui. '' 1' funziona solo per me. – kungphu

37

Sto eseguendo uwsgi versione 1.9.5 e l'opzione

uwsgi --py-autoreload 1 

grandi opere

+1

bel pescato. non elencato in --help output. Grazie! – user237419

+1

Uso della modalità imperatore uwsgi, non funziona né per il lancio di un processo di imperatore né per la singola app ini config. L'ex dà "opzione sconosciuta", quest'ultimo non dà nulla. In ogni caso, il processo deve essere riavviato affinché le modifiche vengano notate ... –

+0

Come eseguire uwsgi --py-autoreload 1 – Burf2000

5

Se si sta configurando uwsgi con argomenti del comando, passare --py-autoreload=1:

uwsgi --py-autoreload=1 

Se stai usando un file .ini da configurare e utilizzare uwsgiuwsgi --ini, aggiungere quanto segue al file .ini:

py-autoreload = 1 
Problemi correlati