2017-02-19 14 views
3

私はフラスコのアプリケーションをいくつかの仕事を聞いている。プロセスはかなり長く(1分と言えば)、同時に2つの要求を処理することはできません。フラスコ、処理リクエスト1 by 1

リクエストが届いたら、私はポートフラスコを閉じて、完了したらもう一度聞いて開くことができます。あるいは、セマフォをセットアップすることもできますが、フラスコが同時にどのように動作しているかわかりません。

アドバイスはありますか?

from flask import Flask, request 
app = Flask(__name__) 

@app.route("/",methods=['GET']) 
def say_hi(): 
    return "get not allowed" 

@app.route("/",methods=['POST']) 
def main_process(): 
    # heavy process here to run alone 
    return "Done" 

if __name__ == "__main__": 
    app.run(debug=True,host='0.0.0.0') 
+0

を読みますか?フラスコを直接通すか、それともWSGIモジュールとして走っていますか? –

+0

私はwsgiモジュール – mosh442

+1

を使用しています。この場合は少し複雑かもしれません。 WSGIサーバー(構成によって異なる)は、複数のプロセスを並列に生成することができますが、Pythonのロックはスレッド間でのみ動作し、プロセス間では動作しません。ロックできる共有リソースを導入する必要があります。これは、データベース、ファイル、または共有ロック(例えば、[名前付きセマフォ])(http://stackoverflow.com/q/2798727)です。 –

答えて

1

あなたはこのためにセマフォを使用することができます。

import threading 
import time 
sem = threading.Semaphore() 

@app.route("/",methods=['POST']) 
def main_process(): 
    sem.acquire() 
    # heavy process here to run alone 
    sem.release() 
    return "Done" 

セマフォの使用量は、一般的なリソースへのアクセスを制御することです。

ゲオルクSchöllyコメントで書いたように、上記の解決策:

あなたはこのSO質問はenter link description here

EDIT同様にあなたを助けることができ、ここでenter link description here

にセマフォについての詳細情報を見ることができます複数のサービスの状況では問題があります。

あなたの目標を達成するためにwsgiを使用することはできますが、

@app.route("/",methods=['POST']) 
def main_process(): 
    uwsgi.lock() 
    # Critical section 
    # heavy process here to run alone 
    uwsgi.unlock() 
    return "Done" 

uWSGIあなたは労働者がより多くの情報については

を処理同期するために使用できるロックの設定可能数をサポートし、どのようにフラスコを実行する上で滑走しているhere

+0

複数のプロセスがある場合、これは機能しません。ここのロックは、複数のプロセスにわたって機能しません。これは、Webサーバーの通常の構成です。 –

+0

@GeorgSchölly、あなたのコメントのおかげで、あなたのコメントに関する編集セクションを追加しました。 –

0

あなたは、いくつかの作業がすでに進行中であることを示すためにthreading.Lockを追加してみてください:

import threading 
from contextlib import ExitStack 

busy = threading.Lock() 
@app.route("/",methods=['POST']) 
def main_process(): 
    if not busy.acquire(timeout = 1): 
     return 'The application is busy, refresh the page in a few minutes' 

    # ensure busy.release() is called even if an exception is thrown 
    with ExitStack() as stack: 
     stack.callback(busy.release) 
     # heavy process here to run alone 

    return "Done" 

しかし、フラスコ、デフォルトで時間(詳細here)で処理する唯一の要求を許可、 1つのリクエストの処理中に、プロセスが終了するまで(たぶんリクエストタイムアウトエラーが発生するまで)、他のすべてのユーザーのページはロードされないので、変更する必要はありません何でも
上記のコードのように、他のユーザーにメッセージを表示させる場合は、ワーカーの数を2に増やして、1つのワーカーがリクエストを処理したときにもう1つのワーカーが他のユーザーから解放されるようにします。

+0

ロックがないと、これは競合状態になりがちです。 –

+0

@GeorgSchölly良い点。ロックを使用するように編集 – Leva7

+0

複数のプロセスがある場合、これは機能しません。ここのロックは、複数のプロセスにわたって機能しません。これは、Webサーバーの通常の構成です。 –

関連する問題