2011-05-13 12 views
5

Una delle cose che mi piace dell'ambiente di sviluppo di Google App Engine è che non devo riavviare il server ogni volta che apporto modifiche a qualsiasi file di origine Python, altri file statici o persino file di configurazione. Mi ha rovinato e mi dimentico di riavviare il server quando lavoro con altri ambienti server (tornadoweb, web.py, node.js).In che modo Google App Engine dev_appserver.py pubblica nuovi contenuti senza riavviare?

Qualcuno può spiegare come lo fa GAE? Quanto è difficile rendere altri server (almeno basati su Python) per ottenere la stessa cosa?

risposta

3

È possibile visualizzare la sorgente per dev_appserver.py(link). Sembra ModuleManager fa una copia di sys.modules e monitor ogni modulo per tenere traccia delle modifiche in base al tempo:

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

si potrebbe elaborare più per favore? Soprattutto su "Quanto è difficile rendere altri server (almeno basati su Python) per ottenere la stessa cosa?" – avalancha

2

lotto di server web come GAE, fanno uso del modulo python reload per vedere l'effetto di modifica del codice senza riavviare il processo server

import something 

if is_changed(something) 
    somthing = reload(something) 

Citazione di documenti pitone: quando viene eseguita reload (modulo) :

Il codice dei moduli Python viene ricompilato e il codice livello modulo viene rieseguito, definendo un nuovo insieme di oggetti che sono associati ai nomi nel dizionario del modulo. La funzione init dei moduli di estensione non viene chiamata una seconda volta.

Come con tutti gli altri oggetti in Python, i vecchi oggetti vengono recuperati solo dopo che i loro conteggi di riferimento scendono a zero.

I nomi nello spazio dei nomi modulo vengono aggiornati in modo da puntare a qualsiasi oggetto nuovo o modificato. Altri riferimenti ai vecchi oggetti (come i nomi esterni al modulo) non sono in estensione per fare riferimento ai nuovi oggetti e devono essere aggiornati in ogni spazio dei nomi in cui si verificano se ciò è desiderato.