2012-06-05 12 views
5

tengo esta sencilla aplicación Frasco:Frasco y Web.py tanto colgar en atexit

from flask import Flask 
import prolog_handler as p 

app = Flask(__name__) 
app.debug = False 

@app.route('/') 
def hello(): 
    for rule in p.rules: 
     print rule 
    return 'hello' 

if __name__ == '__main__': 
    app.run(host='0.0.0.0', port=8080) 

El módulo prolog_handler inicia una sesión con un triplestore y cargas algunas reglas. También tiene una función atexit que finaliza la sesión e imprime un mensaje como "Cerrando ...". Comienzo el servidor desde el indicador bash con python myapp.py. Cada vez que presiono CTRL-C para detener el servidor, no pasa nada. No me devuelven al mensaje bash, y no veo impreso el mensaje "Cerrando ...". También traté de hacer esto con Web.py con los mismos resultados.

El prolog_handler que hace es literalmente tan simple como esto:

tstore = openPrologSession() 
rules = ... 

def cleanUp(): 
    print "Closing..." 
    tstore.endSession() 

atexit.register(cleanUp) 

¿Por qué es tan difícil de sólo realizar una tarea atexit?

PD: si comento todo sobre abrir la sesión de Prolog y finalizarla, y simplemente dejar la parte que imprime el mensaje "Cerrando ...", entonces veo el mensaje "Cerrando ..." cuando Presiono CTRL-C y me devuelven al indicador bash. Eso funciona como se esperaba ¿Pero de qué sirve atexit si no puedo hacer nada útil con eso?

Respuesta

6

esto puede no ser la respuesta perfecta pero tratado de usar la siguiente receta para frasco:

# These functions should be called when you tear down the application 
app.teardown_functions = [] 

def teardown_applications(): 
    for func in app.teardown_functions: 
     print('Calling teardown function %s' % func.__name__) 
     func() 

app.teardown_functions.append(function_tocall_at_exit) 

Esto parece funcionar para mí. También tiendo a usar gevent para todas las aplicaciones de matraz

if __name__ == '__main__': 
    gevent.signal(signal.SIGINT, teardown_applications) 
    http_server = WSGIServer(('', 5000), app) 
    http_server.serve_forever() 

Esto generalmente me funciona.

Algunas de las importaciones de módulo:

from flask import Flask 
from gevent.wsgi import WSGIServer 
import gevent 
import signal 

from gevent import monkey 
monkey.patch_all() 
+0

Aha! Hombre genial, gracias! –

+0

@John Peter Thompson Garcés: Gracias. Verifica si esto funciona para ti. – pyfunc

+0

¡Sí, funcionó como se esperaba! –