Flask和Web.py都挂在了atexit上

时间:2012-06-05 14:38:46

标签: python flask web.py atexit

我有这个简单的Flask应用程序:

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)

prolog_handler模​​块启动与triplestore的会话并加载一些规则。它还有一个atexit函数,用于结束会话并打印“Closing ......”之类的消息。我使用python myapp.py从bash提示符启动服务器。每当我按CTRL-C停止服务器时,都没有任何反应。我没有返回到bash提示符,我没有看到打开“关闭...”消息。我也尝试用Web.py做同样的结果。

prolog_handler的确如此简单:

tstore = openPrologSession()
rules = ...

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

atexit.register(cleanUp)

那么为什么只执行atexit任务这么困难呢?

PS:如果我发表关于打开Prolog会话并结束它的所有内容,并且只留下打印消息“Closing ...”的部分,那么我确实看到了“Closing ...”消息点击CTRL-C,我确实返回到bash提示符。这按预期工作。但是,如果我不能对它做任何有用的事情,有什么意义呢?

1 个答案:

答案 0 :(得分:6)

这可能不是完美的答案,但我尝试将以下内容用于Flask:

# 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)

这似乎对我有用。我也倾向于将gevent用于所有烧瓶应用

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

这通常适合我。

部分模块导入:

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

from gevent import monkey
monkey.patch_all()