Joh*_*cés 5 python atexit web.py flask
我有这个简单的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)
Run Code Online (Sandbox Code Playgroud)
prolog_handler模块启动与triplestore的会话并加载一些规则.它还有一个atexit函数,用于结束会话并打印"Closing ......"之类的消息.我用bash提示符启动服务器python myapp.py.每当我按CTRL-C停止服务器时,都没有任何反应.我没有返回到bash提示符,我没有看到打开"关闭..."消息.我也尝试用Web.py做同样的结果.
prolog_handler所做的就像这样简单:
tstore = openPrologSession()
rules = ...
def cleanUp():
print "Closing..."
tstore.endSession()
atexit.register(cleanUp)
Run Code Online (Sandbox Code Playgroud)
那么为什么执行atexit任务如此困难呢?
PS:如果我注释掉有关打开Prolog会话并结束它的所有内容,并且只留下打印消息"Closing ..."的部分,那么当我按下CTRL时,我确实看到了"Closing ..."消息C和我确实返回到bash提示符.这按预期工作.但是,如果我不能对它做任何有用的事情,有什么意义呢?
这可能不是完美的答案,但我尝试将以下内容用于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)
Run Code Online (Sandbox Code Playgroud)
这似乎对我有用.我也倾向于将gevent用于所有烧瓶应用
if __name__ == '__main__':
gevent.signal(signal.SIGINT, teardown_applications)
http_server = WSGIServer(('', 5000), app)
http_server.serve_forever()
Run Code Online (Sandbox Code Playgroud)
这通常对我有用.
一些模块导入:
from flask import Flask
from gevent.wsgi import WSGIServer
import gevent
import signal
from gevent import monkey
monkey.patch_all()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1434 次 |
| 最近记录: |