2011-05-13 4 views
5

Una de las cosas que me gusta del entorno de desarrollo de Google App Engine es que no tengo que reiniciar el servidor cada vez que realizo cambios en los archivos fuente de python, otros archivos estáticos o incluso archivos de configuración. Me ha echado a perder y me olvidé de reiniciar el servidor cuando estoy trabajando con otros entornos de servidor (tornadoweb, web.py, node.js).¿Cómo funciona Google App Engine dev_appserver.py para servir contenido nuevo sin reiniciar?

¿Alguien puede explicar cómo GAE hace eso? ¿Qué tan difícil es hacer que otros servidores (al menos basados ​​en Python) logren lo mismo?

Respuesta

3

Puede ver la fuente para dev_appserver.py(link). Parece que ModuleManager hace una copia de sys.modules y supervisa cada módulo para realizar un seguimiento de los cambios en función del tiempo:

class ModuleManager(object): 
    """Manages loaded modules in the runtime. 

    Responsible for monitoring and reporting about file modification times. 
    Modules can be loaded from source or precompiled byte-code files. When a 
    file has source code, the ModuleManager monitors the modification time of 
    the source file even if the module itself is loaded from byte-code. 
    """ 

http://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/tools/dev_appserver.py#3636

+0

podría elaborar más por favor? Especialmente en '¿Qué tan difícil es hacer que otros servidores (al menos basados ​​en Python) logren lo mismo? – avalancha

2

Lote de servidores web como GAE, hacer uso de pitón reload módulo para ver el efecto de cambio de código sin necesidad de reiniciar el proceso de servidor

import something 

if is_changed(something) 
    somthing = reload(something) 

Presupuesto de documentación de Python: Cuando se ejecuta recarga (módulo) :

El código de los módulos de Python se recompila y se vuelve a ejecutar el código de nivel de módulo, definiendo un nuevo conjunto de objetos que están vinculados a nombres en el diccionario del módulo. La función de inicio de los módulos de extensión no se llama por segunda vez.

Al igual que con todos los demás objetos en Python, los objetos antiguos solo se reclaman después de que sus recuentos de referencia caen a cero.

Los nombres en el espacio de nombres del módulo se actualizan para señalar a los objetos nuevos o modificados. Otras referencias a los objetos antiguos (como los nombres externos al módulo) no se recuperan para hacer referencia a los objetos nuevos y deben actualizarse en cada espacio de nombres donde se producen si así se desea.