Flaskでのストリーミングとリアルタイム処理を理解する

この記事では、PythonのFlaskフレームワークを使用したストリーミングとリアルタイム処理について解説します。具体的なコード例とその解説、応用例を含めています。

目次

Flaskとは

Flaskは、Pythonで書かれたマイクロウェブフレームワークです。短いコードで効率的なWebアプリケーションを開発できるのが特徴です。

ストリーミングとリアルタイム処理の基本

ストリーミングとは、データを連続的に送受信することを指します。リアルタイム処理は、入力データに対して即座に処理を行う手法です。

ストリーミングの利点と欠点

ストリーミングの主な利点は、大量のデータを効率よく処理できることです。欠点は、リアルタイムでのデータ処理には高いリソースが必要となる場合があることです。

Flaskでのストリーミング実装

Flaskでは`stream_with_context`という関数を使って、ストリーミングを実装できます。

基本的なストリーミングのコード例

from flask import Flask, Response, stream_with_context
import time

app = Flask(__name__)

@app.route('/stream')
def stream():
    def generate():
        for i in range(5):
            yield f"data: {i}\n\n"
            time.sleep(1)
    
    return Response(generate(), content_type='text/event-stream')

if __name__ == "__main__":
    app.run(debug=True)

上記のコードでは、`/stream`にアクセスすると、0から4までの数値が1秒ごとに表示されます。

コードの解説

– `stream_with_context`: この関数を用いてストリーミングを行います。
– `yield`: これによりデータが連続して送られます。
– `content_type=’text/event-stream’`: サーバーからのイベントをクライアントに送信するためのContent-Typeを指定します。

応用例

リアルタイムチャット

from flask import Flask, render_template, request, Response

app = Flask(__name__)
messages = []

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/send', methods=['POST'])
def send():
    message = request.form['message']
    messages.append(message)
    return '', 204

@app.route('/receive')
def receive():
    def stream():
        while True:
            if messages:
                yield f"data: {messages.pop(0)}\n\n"
                
    return Response(stream(), content_type='text/event-stream')

コードの解説

– `messages`: メッセージを一時的に保存するリスト。
– `yield f”data: {messages.pop(0)}\n\n”`: メッセージが存在すれば、それを取り出して送信します。

リアルタイムダッシュボード

from flask import Flask, render_template, Response
import random
import time

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('dashboard.html')

@app.route('/data')
def data():
    def generate_random_data():
        while True:
            yield f"data: {random.randint(1, 100)}\n\n"
            time.sleep(1)
    
    return Response(generate_random_data(), content_type='text/event-stream')

コードの解説

– `random.randint(1, 100)`: 1から100までのランダムな数値を生成。
– `time.sleep(1)`: 1秒待機してから次のデータを送信。

まとめ

この記事では、Flaskを使用したストリーミングとリアルタイム処理について詳しく解説しました。基本的な実装方法から応用例までを網羅していますので、ぜひ参考にしてください。

コメント

コメントする

目次