6

私はこのシンプルな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モジュールは、トリプルストアとのセッションを開始し、いくつかのルールをロードします。また、セッションを終了し、「Closing...」のようなメッセージを出力するatexit関数もあります。を使用してbashプロンプトからサーバーを起動しますpython myapp.py。CTRL-Cを押してサーバーを停止しても、何も起こりません。bashプロンプトに戻らず、「Closing...」メッセージが出力されません。Web.pyでもこれを実行しようとしましたが、同じ結果になりました。

prolog_handlerが行うことは、文字通り次のように単純です。

tstore = openPrologSession()
rules = ...

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

atexit.register(cleanUp)

では、なぜatexitタスクを実行するのがそれほど難しいのでしょうか。

PS:プロローグセッションを開いて終了することに関するすべてのことをコメントアウトし、「Closing ...」というメッセージを出力する部分を残すと、CTRL-を押すと「Closing...」メッセージが表示されます。 Cと私はbashプロンプトに戻ります。それは期待どおりに機能します。しかし、私がそれで有用なことを何もできない場合、atexitのポイントは何ですか?

4

1 に答える 1

7

これは完璧な答えではないかもしれませんが、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()
于 2012-06-05T15:50:41.197 に答える