1. ホーム
  2. python

[解決済み] flaskにバックグラウンドスレッドを追加するには?

2023-02-14 05:19:59

質問

私はflaskを試すために小さなゲームサーバーを書くのに忙しいです。ゲームは、ユーザーにRESTを介してAPIを公開します。ユーザーがアクションを実行し、データを照会するのは簡単ですが、私はそれを提供したいと思います。 "game world" の外側で app.run() ループの外側でゲームエンティティを更新する、などです。Flaskがとてもきれいに実装されていることを考えると、これを行うためのFlaskの方法があるかどうか見てみたいです。

どのように解決する?

追加スレッドは、WSGIサーバーから呼び出されるのと同じアプリから開始されなければなりません。

以下の例では、5秒ごとに実行されるバックグラウンドスレッドを作成し、Flaskのルーティング関数でも利用可能なデータ構造を操作しています。

import threading
import atexit
from flask import Flask

POOL_TIME = 5 #Seconds
    
# variables that are accessible from anywhere
commonDataStruct = {}
# lock to control access to variable
dataLock = threading.Lock()
# thread handler
yourThread = threading.Thread()

def create_app():
    app = Flask(__name__)

    def interrupt():
        global yourThread
        yourThread.cancel()

    def doStuff():
        global commonDataStruct
        global yourThread
        with dataLock:
            pass
            # Do your stuff with commonDataStruct Here

        # Set the next thread to happen
        yourThread = threading.Timer(POOL_TIME, doStuff, ())
        yourThread.start()   

    def doStuffStart():
        # Do initialisation stuff here
        global yourThread
        # Create your thread
        yourThread = threading.Timer(POOL_TIME, doStuff, ())
        yourThread.start()

    # Initiate
    doStuffStart()
    # When you kill Flask (SIGTERM), clear the trigger for the next thread
    atexit.register(interrupt)
    return app

app = create_app()          

こんな感じでGunicornから呼び出します。

gunicorn -b 0.0.0.0:5000 --log-config log.conf --pid=app.pid myfile:app