2012-01-12 16 views

Respuesta

8

Usted podría tratar de usar supervisord como gerente para su aplicación Uwsgi. También tiene una función de reloj que recarga automáticamente un proceso cuando un archivo o carpeta ha sido "tocado"/modificado.

se encuentra un buen tutorial aquí: Flask+NginX+Uwsgi+Supervisord

+0

El enlace ya no está disponible – ricosrealm

-3

Me temo que el frasco es realmente demasiado huesos desnudos tener una aplicación como esta incluido por defecto.

dinámicamente recargando código en la producción es generalmente una mala cosa, pero si usted está preocupado acerca de un entorno de desarrollo, echar un vistazo a esta secuencia de comandos shell bash http://aplawrence.com/Unixart/watchdir.html

sólo cambia el intervalo de reposo a lo que se adapte a sus necesidades y sustituto el comando echo con lo que sea que utilices para volver a cargar uwsgi. Ejecuto uwsgi un master mode y solo envío un comando killall uwsgi.

5

La funcionalidad de auto-recarga del desarrollo del modo matraz es efectivamente prestado por la biblioteca Werkzeug subyacente. El código relevante está en werkzeug/serving.py - vale la pena echarle un vistazo. Pero, básicamente, la aplicación principal genera el servidor WSGI como un subproceso que registra cada archivo .py activo una vez por segundo, en busca de cambios. Si ve alguno, el subproceso se cierra y el proceso principal lo vuelve a iniciar de nuevo, de hecho, recarga los chages.

No hay ninguna razón por la que no se podía poner en práctica una técnica similar a la capa de uWSGI. Si no desea utilizar un bucle stat, puede intentar utilizar los comandos subyacentes de visualización de archivos del sistema operativo. Al parecer (según el código de Werkzeug), pyinotify está libre de errores, pero quizás Watchdog obras? Pruebe algunas cosas y vea qué pasa.

Editar:

En respuesta al comentario, creo que esto sería bastante fácil volver a implementar. Basándose en el ejemplo proporcionado a partir de su enlace, junto con el código de 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 

Es no probado, pero debería funcionar.

+0

Gracias por los consejos! Me parecía un poco a través werkzeug.serving, pero esperaba poder evitar ensuciarme las manos, pidiendo una solución rápida ... tal vez es hora de que alguien lo implementa. :) – Florian

-1
import gevent.wsgi 
import werkzeug.serving 

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

(se puede utilizar un servidor WSGI arbitraria)

+3

Lamentablemente, esta no es una respuesta a mi pregunta. Quiero uwsgi para hacer la porción. Por cierto: Flask's app.run (debug = True) proporciona recarga desde la caja. – Florian

+0

Aunque el desarrollador. El servidor web incluido con Flask proporciona recarga, ¡también proporciona un shell para la depuración! ¡No quieres dar un shell Python a todos los que están en producción! – Jabba

12

Para entorno de desarrollo se puede tratar mediante el parámetro --python-autoreload de uwsgi. Al mirar el código fuente, puede funcionar solo en modo enhebrado (--enable-threads).

+6

Éste me funcionó. Al agregar 'python-autoreload = 1' a mi archivo' uwsgi.ini', se vuelve a cargar! ¡Gracias! – JoshFinnie

+1

Usando el modo uwsgi emperador - esto funcionó al agregar al ini de la aplicación. ¡Gracias! –

+1

creo que vale la pena señalar que los valores '' 1' y true' * * no son intercambiables en este caso. Solo '1' funciona para mí. – kungphu

37

Me postulo uwsgi versión 1.9.5 y la opción

uwsgi --py-autoreload 1 

funciona muy bien

+1

buena captura. no listado en --help output. ¡Gracias! – user237419

+1

Al usar el modo uwsgi emperador, no funciona ni para el inicio del proceso del emperador ni para la configuración individual de la aplicación. El ex da "opción desconocida", el último no da nada. De cualquier forma, el proceso debe reiniciarse para que se noten los cambios ... –

+0

¿Cómo ejecuto uwsgi --py-autoreload 1? – Burf2000

5

Si está configurando uwsgi con argumentos de comandos, pase --py-autoreload=1:

uwsgi --py-autoreload=1 

Si está utilizando un archivo .ini para configurar y usar uwsgiuwsgi --ini, añada lo siguiente a su archivo .ini:

py-autoreload = 1 
Cuestiones relacionadas