FlaskはPythonで書かれた軽量なWebフレームワークで、デフォルトでは一度に一つのリクエストしか処理できません。しかし、同時アクセスを有効にするためには、Flaskの起動オプションにthreaded=True
を設定することで並列処理が可能になります。
また、特定の処理に対して同時実行数を制限したい場合もあります。例えば、リソースを大量に消費する処理や、同時実行を考慮していない処理などです。そのような場合には、Queueを利用して多重実行を制御することができます。
以下に、Flaskでの同時アクセスの有効化と、特定の処理に対する同時実行の制御のコード例を示します。
from flask import Flask, make_response
import time
from Queue import Queue
import functools
app = Flask(__name__)
# 多重実行用のキュー
multipleQueue = Queue(maxsize=2)
singleQueue = Queue(maxsize=1)
# 多重制御の関数デコレータ
def multiple_control(q):
def _multiple_control(func):
@functools.wraps(func)
def wrapper(*args,**kwargs):
q.put(time.time())
print("/// [start] critial zone")
result = func(*args,**kwargs)
print("/// [end] critial zone")
q.get()
q.task_done()
return result
return wrapper
return _multiple_control
# 重たい処理
def heavy_process(data):
print("<business> : " + data)
time.sleep(10)
return "ok : " + data
@app.route('/hello', methods=['GET'])
def hello():
print('hello')
return(make_response('hello'))
@app.route('/goodby', methods=['GET'])
def goodby():
print('goodby')
time.sleep(10)
return(make_response('goodby'))
@app.route('/world/<string:value>', methods=['GET'])
@multiple_control(singleQueue)
def world(value):
result = heavy_process(value)
return(make_response(result))
if __name__ == "__main__":
app.run(host='localhost', port=3000, threaded=True)
このコードでは、/world/<string:value>
へのアクセスに対して同時実行を制御しています。具体的には、@multiple_control(singleQueue)
デコレータを使用して、同時に一つのリクエストしか処理しないようにしています。
以上のように、Flaskでは同時アクセスの有効化や特定の処理に対する同時実行の制御が可能です。これにより、アプリケーションのパフォーマンスを向上させることができます。.