Rumah > pembangunan bahagian belakang > Tutorial Python > Bagaimana untuk Memulakan dan Menggunakan Semula Objek Global dengan Cekap Merentas Titik Akhir FastAPI?

Bagaimana untuk Memulakan dan Menggunakan Semula Objek Global dengan Cekap Merentas Titik Akhir FastAPI?

Barbara Streisand
Lepaskan: 2024-11-30 14:54:14
asal
295 orang telah melayarinya

How to Efficiently Initialize and Reuse a Global Object Across FastAPI Endpoints?

Bagaimana untuk Memulakan Objek Global atau Pembolehubah dan Menggunakannya Semula dalam Setiap Titik Akhir FastAPI?

Latar Belakang

Pertimbangkan kelas tersuai yang direka untuk menghantar pemberitahuan, yang permulaannya melibatkan mewujudkan sambungan ke pelayan pemberitahuan, proses yang memakan masa. Kelas ini digunakan dalam tugas latar belakang dalam FastAPI untuk mengelakkan penangguhan tindak balas titik akhir. Walau bagaimanapun, pendekatan semasa mempunyai had:

file1.py:
noticlient = NotificationClient()

@app.post("/{data}")
def send_msg(somemsg: str, background_tasks: BackgroundTasks):
    result = add_some_tasks(data, background_tasks, noticlient)
    return result

file2.py:
def add_some_tasks(data, background_tasks: BackgroundTasks, noticlient):
    background_tasks.add_task(noticlient.send, param1, param2)
    result = some_operation
    return result
Salin selepas log masuk

Pengamatan NotificationClient global dalam file1.py menghasilkan berbilang pengamulaan berlebihan setiap kali permintaan diterima, yang tidak cekap.

Pendekatan

Pilihan 1: Memanfaatkan app.state

FastAPI membenarkan anda menyimpan keadaan sewenang-wenangnya menggunakan app.state. Anda boleh memulakan objek NotificationClient dan menambahkannya pada app.state semasa permulaan atau penutupan FastAPI menggunakan fungsi kitaran hayat pergantungan seperti jangka hayat.

from fastapi import FastAPI, Request
from contextlib import asynccontextmanager


@asynccontextmanager
async def lifespan(app: FastAPI):
    ''' Run at startup
        Initialise the Client and add it to app.state
    '''
    app.state.n_client = NotificationClient()
    yield
    ''' Run on shutdown
        Close the connection
        Clear variables and release the resources
    '''
    app.state.n_client.close()


app = FastAPI(lifespan=lifespan)


@app.get('/')
async def main(request: Request):
    n_client = request.app.state.n_client
    # ...
Salin selepas log masuk

Pilihan 2: Menggunakan jangka hayat Starlette

Pengendali jangka hayat Starlette membolehkan anda menentukan objek keadaan yang boleh diakses dalam titik akhir melalui request.state.

from fastapi import FastAPI, Request
from contextlib import asynccontextmanager


@asynccontextmanager
async def lifespan(app: FastAPI):
    ''' Run at startup
        Initialise the Client and add it to request.state
    '''
    n_client = NotificationClient()
    yield {'n_client': n_client}
    ''' Run on shutdown
        Close the connection
        Clear variables and release the resources
    '''
    n_client.close()


app = FastAPI(lifespan=lifespan)


@app.get('/')
async def main(request: Request):
    n_client = request.state.n_client
    # ...
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Memulakan dan Menggunakan Semula Objek Global dengan Cekap Merentas Titik Akhir FastAPI?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan