71

Flaskアプリケーション内でPythonで新しいスレッドを開始しようとしています。リクエストによってトリガーされるバックグラウンド作業を行っていますが、リクエストに応答するために作業が完了するのを待つ必要はありません。

このサブ脅威のフラスコリクエストを、入ってくるリクエストに設定することは可能ですか?理由は、DB(mongoDBの前にあるmongoengine)へのクエリのACLは、リクエストのユーザー(flaskのリクエストオブジェクトから取得)に依存して、オブジェクトにアクセスできるかどうかを確認します。サブスレッドでは使用できません。

どんな考えでも大歓迎です。

これが私が今それをどのように扱っているかの擬似コードですが、それは機能していません。

@app.route('/my_endpoint', methods=['POST'])
def my_endpoint_handler():
    #do tracking in sub-thread so we don't hold up the page
    def handle_sub_view(req):
        from flask import request
        request = req
        # Do Expensive work
    thread.start_new_thread(handle_sub_view, (request))
    return "Thanks"
4

5 に答える 5

78

スレッド コードを でラップして、コンテキスト ローカルtest_request_contextにアクセスできるようにします。

@app.route('/my_endpoint', methods=['POST'])
def my_endpoint_handler():
    #do tracking in sub-thread so we don't hold up the page
    def handle_sub_view(req):
        with app.test_request_context():
            from flask import request
            request = req
            # Do Expensive work
    thread.start_new_thread(handle_sub_view, (request))
    return "Thanks"

編集:スレッドが元のリクエストとは異なるコンテキストを持つことを指摘する価値があります。スレッドを生成する前に、ユーザー ID などの興味深い要求データを抽出する必要があります。その後、ID を使用してサブスレッドで (別の) ユーザー オブジェクトを取得できます。

于 2012-03-29T19:32:24.273 に答える
5

必要な情報をコピーして渡すことができます。

@app.route('/my_endpoint', methods=['POST'])
def my_endpoint_handler():
    #do tracking in sub-thread so we don't hold up the page
    def handle_sub_view(data):
        # Use the data in subprocess
    data = request.get_json()  # copy the data
    thread.start_new_thread(handle_sub_view, data)
    return "Thanks"
于 2015-05-08T21:45:42.587 に答える