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

FastAPI でバックグラウンド ジョブを効率的に実行するにはどうすればよいですか?

DDD
リリース: 2024-12-05 15:32:10
オリジナル
741 人が閲覧しました

How to Efficiently Run Background Jobs in FastAPI?

FastAPI のバックグラウンド ジョブ: 関数の非同期実行

FastAPI では、ブロックすべきでない非同期操作を実行する場合にバックグラウンド関数が必要です。または、メインの API 操作を遅らせます。バックグラウンド ジョブを効果的に設定する方法を見てみましょう。

1.スレッドベースのバックグラウンド タスク:

スレッドの開始は、バックグラウンドで関数を実行する簡単な方法です:

def start_worker():
    print('[main]: starting worker...')
    my_worker = worker.Worker()
    my_worker.working_loop() # this function prints "hello" every 5 seconds

if __name__ == '__main__':
    print('[main]: starting...')
    uvicorn.run(app, host="0.0.0.0", port=8000, reload=True)
    _worker_thread = Thread(target=start_worker, daemon=False)
    _worker_thread.start()
ログイン後にコピー

ただし、このアプローチには制限があります。メイン スレッドがブロックされるためです。実行の。これを回避するには、以下に示すように、メイン API プロセスの前にスレッドを開始します。

_worker_thread.start()
uvicorn.run(app, host="0.0.0.0", port=8000, reload=True)
ログイン後にコピー

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。 AsyncIO バックグラウンド タスク:

バックグラウンド関数が非同期の場合、asyncio.create_task() 関数を使用できます:

from fastapi import FastAPI
from contextlib import asynccontextmanager
import asyncio


async def print_task(s): 
    while True:
        print('Hello')
        await asyncio.sleep(s)

        
@asynccontextmanager
async def lifespan(app: FastAPI):
    # Run at startup
    asyncio.create_task(print_task(5))
    yield
    # Run on shutdown (if required)
    print('Shutting down...')


app = FastAPI(lifespan=lifespan)
ログイン後にコピー

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

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