ホームページ > バックエンド開発 > Python チュートリアル > FastAPI でバックグラウンド タスクを実行するにはどうすればよいですか?

FastAPI でバックグラウンド タスクを実行するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-12-18 12:03:18
オリジナル
554 人が閲覧しました

How to Run Background Tasks in FastAPI?

FastAPI でのバックグラウンド タスクの実行

FastAPI では、開発者は、バックグラウンドで関数を実行する必要があるシナリオに遭遇することがあります。彼らのAPI。これを実現するには、スレッド メカニズムを採用する必要があります。

解決策 1: uvicorn.run の前にスレッドを開始する

1 つの方法では、uvicorn.run を呼び出す前にスレッドを開始します。 uvicorn.run がスレッドをブロックするためです。このアプローチは次のように実装できます:

import time
import threading
from fastapi import FastAPI
import uvicorn

app = FastAPI()
class BackgroundTasks(threading.Thread):
    def run(self,*args,**kwargs):
        while True:
            print('Hello')
            time.sleep(5)
  
if __name__ == '__main__':
    t = BackgroundTasks()
    t.start()
    uvicorn.run(app, host="0.0.0.0", port=8000)
ログイン後にコピー

あるいは、開発者は FastAPI の起動イベントを利用して、アプリケーションの開始前にスレッドを開始できます:

@app.on_event("startup")
async def startup_event():
    t = BackgroundTasks()
    t.start()
ログイン後にコピー

解決策 2: イベントスケジューラ

もう 1 つのオプションは、定期的なイベント スケジューラを実装することです。バックグラウンド タスクの場合:

import sched, time
from threading import Thread
from fastapi import FastAPI
import uvicorn

app = FastAPI()
s = sched.scheduler(time.time, time.sleep)

def print_event(sc): 
    print("Hello")
    sc.enter(5, 1, print_event, (sc,))

def start_scheduler():
    s.enter(5, 1, print_event, (s,))
    s.run()

@app.on_event("startup")
async def startup_event():
    thread = Thread(target=start_scheduler)
    thread.start()

if __name__ == '__main__':
    uvicorn.run(app, host="0.0.0.0", port=8000)
ログイン後にコピー

解決策 3: イベント ループの使用

非同期バックグラウンド タスク (async def 関数) の場合、開発者は現在のイベント ループを利用できます。 asyncio.create_task() 関数を使用:

from asyncio import create_task
from fastapi import FastAPI

app = FastAPI()

@app.on_event("startup")
async def startup_task():
    await create_task(print_task(5))
ログイン後にコピー

このアプローチでは、イベント ループは、uvicorn サーバーの起動時に作成されます。

以上がFastAPI でバックグラウンド タスクを実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート