๐ ๐¶
๐ ๐ช ๐ฌ โ (๐) ๐ ๐ ๐ ๏ธ โญ ๐ธ โถ๏ธ ๐. ๐ โ ๐ ๐ ๐ ๐ ๐ ๏ธ ๐, โญ ๐ธ โถ๏ธ ๐จ ๐จ.
๐ ๐, ๐ ๐ช ๐ฌ โ (๐) ๐ ๐ ๐ ๏ธ ๐โ ๐ธ ๐คซ ๐ฝ. ๐ ๐ผ, ๐ ๐ ๐ ๐ ๏ธ ๐, โฎ๏ธ โ๏ธ ๐ต ๐ฒ ๐ ๐จ.
โฉ๏ธ ๐ ๐ ๐ ๏ธ โญ ๐ธ โถ๏ธ โ ๐จ, & โถ๏ธ๏ธ โฎ๏ธ โซ๏ธ ๐ ๐ ๐จ, โซ๏ธ ๐ ๐ ๐ธ ๐ (๐ค "๐" ๐ โ ๐ฅ ๐ถ).
๐ ๐ช ๐ถ โ โ ๐ โน ๐ ๐ ๐ช โ๏ธ ๐ ๐ฑ, & ๐ ๐ฐ ๐ช ๐จ, &/โ๏ธ ๐ ๐ ๐ช ๐งน ๐ โฎ๏ธ. ๐ผ, ๐ฝ ๐ ๐ฑ, โ๏ธ ๐ ๐ ๐ฐ ๐ซ ๐ท.
โ๏ธ ๐ผ¶
โก๏ธ โถ๏ธ โฎ๏ธ ๐ผ โ๏ธ ๐ผ & โคด๏ธ ๐ โ โ โซ๏ธ โฎ๏ธ ๐.
โก๏ธ ๐ ๐ ๐ โ๏ธ ๐ฐ ๐ซ ๐ท ๐ ๐ ๐ โ๏ธ ๐ต ๐จ. ๐ถ
๐ ๐ท ๐ ๐ช ๐จ,, โซ๏ธ ๐ซ 1๏ธโฃ ๐ท ๐ ๐จ, โ๏ธ 1๏ธโฃ ๐ ๐ฉโ๐ป โ๏ธ ๐ณ ๐.
โก๏ธ ๐ ๐ ๐ ๐ท ๐ช โ ๐ฐ, โฉ๏ธ โซ๏ธ โ๏ธ โ ๐ ๐ฝ โช๏ธโก๏ธ ๐พ. ๐ ๐ซ ๐ โซ๏ธ ๐ ๐จ.
๐ ๐ช ๐ โซ๏ธ ๐ ๐ ๐น/๐, โ๏ธ ๐ ๐ โ ๐ โซ๏ธ ๐ ๐ ๐ท ๐ฅ ๐ ๐โโ ๐ ๐ง ๐ฏ, โคด๏ธ ๐ ๐ฏ ๐ ๐ โฉ๏ธ โซ๏ธ ๐ โ๏ธ โ ๐ท ๐ โญ ๐โโ ๐ช ๐ ๐ฌ ๐ ๐.
๐ โซ๏ธโ ๐ฅ ๐ โ, โก๏ธ ๐ ๐ท โญ ๐จ ๐ต, โ๏ธ ๐ด โถ๏ธ๏ธ โญ ๐ธ โถ๏ธ ๐จ ๐จ, ๐ซ โช ๐ โ ๐.
๐¶
๐ ๐ช ๐ฌ ๐ ๐ด & ๐คซ โ โ๏ธ lifespan
๐ข FastAPI
๐ฑ, & "๐ ๐จโ๐ผ" (๐ค ๐ ๐ฆ ๐ โซ๏ธโ ๐ ๐ฅ).
โก๏ธ โถ๏ธ โฎ๏ธ ๐ผ & โคด๏ธ ๐ โซ๏ธ โน.
๐ฅ โ ๐ ๐ข lifespan()
โฎ๏ธ yield
๐ ๐:
from contextlib import asynccontextmanager
from fastapi import FastAPI
def fake_answer_to_everything_ml_model(x: float):
return x * 42
ml_models = {}
@asynccontextmanager
async def lifespan(app: FastAPI):
# Load the ML model
ml_models["answer_to_everything"] = fake_answer_to_everything_ml_model
yield
# Clean up the ML models and release the resources
ml_models.clear()
app = FastAPI(lifespan=lifespan)
@app.get("/predict")
async def predict(x: float):
result = ml_models["answer_to_everything"](x)
return {"result": result}
๐ฅ ๐ฅ โ ๐ฅ ๐ด ๐ ๏ธ ๐ ๐ท ๐ฎ (โ) ๐ท ๐ข ๐ โฎ๏ธ ๐ฐ ๐ซ ๐ท โญ yield
. ๐ ๐ ๐ ๐ ๏ธ โญ ๐ธ โถ๏ธ โ ๐จ, โฎ๏ธ ๐ด.
& โคด๏ธ, โถ๏ธ๏ธ โฎ๏ธ yield
, ๐ฅ ๐ ๐ท. ๐ ๐ ๐ ๐ ๏ธ โฎ๏ธ ๐ธ ๐ ๐ ๐จ, โถ๏ธ๏ธ โญ ๐คซ. ๐ ๐ช, ๐ผ, ๐ โน ๐ ๐พ โ๏ธ ๐ป.
Tip
shutdown
๐ ๐จ ๐โ ๐ โ๏ธ ๐ธ.
๐ฒ ๐ ๐ช โถ๏ธ ๐ โฌ, โ๏ธ ๐ ๐ค ๐ก ๐ โซ๏ธ. ๐คท
๐ ๐ข¶
๐ฅ ๐ ๐, ๐ ๐ฅ โ ๐ ๐ข โฎ๏ธ yield
. ๐ ๐ถ ๐ ๐ โฎ๏ธ yield
.
from contextlib import asynccontextmanager
from fastapi import FastAPI
def fake_answer_to_everything_ml_model(x: float):
return x * 42
ml_models = {}
@asynccontextmanager
async def lifespan(app: FastAPI):
# Load the ML model
ml_models["answer_to_everything"] = fake_answer_to_everything_ml_model
yield
# Clean up the ML models and release the resources
ml_models.clear()
app = FastAPI(lifespan=lifespan)
@app.get("/predict")
async def predict(x: float):
result = ml_models["answer_to_everything"](x)
return {"result": result}
๐ฅ ๐ ๐ข, โญ yield
, ๐ ๐ ๏ธ โญ ๐ธ โถ๏ธ.
& ๐ โฎ๏ธ yield
๐ ๐ ๏ธ โฎ๏ธ ๐ธ โ๏ธ ๐.
๐ ๐ ๐จโ๐ผ¶
๐ฅ ๐ โ
, ๐ข ๐ โฎ๏ธ @asynccontextmanager
.
๐ ๐ ๐ข ๐ ๐ณ ๐ค "๐ ๐ ๐จโ๐ผ".
from contextlib import asynccontextmanager
from fastapi import FastAPI
def fake_answer_to_everything_ml_model(x: float):
return x * 42
ml_models = {}
@asynccontextmanager
async def lifespan(app: FastAPI):
# Load the ML model
ml_models["answer_to_everything"] = fake_answer_to_everything_ml_model
yield
# Clean up the ML models and release the resources
ml_models.clear()
app = FastAPI(lifespan=lifespan)
@app.get("/predict")
async def predict(x: float):
result = ml_models["answer_to_everything"](x)
return {"result": result}
๐ ๐จโ๐ผ ๐ ๐ณ ๐ ๐ ๐ช โ๏ธ with
๐, ๐ผ, open()
๐ช โ๏ธ ๐ ๐จโ๐ผ:
with open("file.txt") as file:
file.read()
โฎ๏ธ โฌ ๐, ๐ค ๐ ๐ ๐จโ๐ผ. ๐ ๐ โ๏ธ โซ๏ธ โฎ๏ธ async with
:
async with lifespan(app):
await do_stuff()
๐โ ๐ โ ๐ ๐จโ๐ผ โ๏ธ ๐ ๐ ๐จโ๐ผ ๐ ๐, โซ๏ธโ โซ๏ธ ๐จ ๐, โญ ๐ฌ with
๐ซ, โซ๏ธ ๐ ๐ ๏ธ ๐ โญ yield
, & โฎ๏ธ โ with
๐ซ, โซ๏ธ ๐ ๐ ๏ธ ๐ โฎ๏ธ yield
.
๐ ๐ ๐ผ ๐, ๐ฅ ๐ซ โ๏ธ โซ๏ธ ๐, โ๏ธ ๐ฅ ๐ถโโ๏ธ โซ๏ธ FastAPI โซ๏ธ โ๏ธ โซ๏ธ.
lifespan
๐ข FastAPI
๐ฑ โ ๐ ๐ ๐จโ๐ผ, ๐ฅ ๐ช ๐ถโโ๏ธ ๐ ๐ lifespan
๐ ๐ ๐จโ๐ผ โซ๏ธ.
from contextlib import asynccontextmanager
from fastapi import FastAPI
def fake_answer_to_everything_ml_model(x: float):
return x * 42
ml_models = {}
@asynccontextmanager
async def lifespan(app: FastAPI):
# Load the ML model
ml_models["answer_to_everything"] = fake_answer_to_everything_ml_model
yield
# Clean up the ML models and release the resources
ml_models.clear()
app = FastAPI(lifespan=lifespan)
@app.get("/predict")
async def predict(x: float):
result = ml_models["answer_to_everything"](x)
return {"result": result}
๐ ๐ (๐ข)¶
Warning
๐ ๐ ๐ต ๐ด & ๐คซ โ๏ธ lifespan
๐ข FastAPI
๐ฑ ๐ฌ ๐.
๐ ๐ช ๐ฒ ๐ถ ๐ ๐.
๐ค ๐ ๐ ๐ฌ ๐ โ ๐ ๏ธ โฎ๏ธ ๐ด & โฎ๏ธ ๐คซ.
๐ ๐ช ๐ฌ ๐ ๐โ๐ฆบ (๐ข) ๐ ๐ช ๐ ๏ธ โญ ๐ธ โถ๏ธ ๐, โ๏ธ ๐โ ๐ธ ๐คซ ๐ฝ.
๐ซ ๐ข ๐ช ๐ฃ โฎ๏ธ async def
โ๏ธ ๐ def
.
startup
๐¶
๐ฎ ๐ข ๐ ๐ ๐ โญ ๐ธ โถ๏ธ, ๐ฃ โซ๏ธ โฎ๏ธ ๐ "startup"
:
from fastapi import FastAPI
app = FastAPI()
items = {}
@app.on_event("startup")
async def startup_event():
items["foo"] = {"name": "Fighters"}
items["bar"] = {"name": "Tenders"}
@app.get("/items/{item_id}")
async def read_items(item_id: str):
return items[item_id]
๐ ๐ผ, startup
๐ ๐โ๐ฆบ ๐ข ๐ ๐ข ๐ฌ "๐ฝ" ( dict
) โฎ๏ธ ๐ฒ.
๐ ๐ช ๐ฎ ๐ ๐ 1๏ธโฃ ๐ ๐โ๐ฆบ ๐ข.
& ๐ ๐ธ ๐ ๐ซ โถ๏ธ ๐จ ๐จ โญ ๐ startup
๐ ๐โ๐ฆบ โ๏ธ ๐.
shutdown
๐¶
๐ฎ ๐ข ๐ ๐ ๐ ๐โ ๐ธ ๐คซ ๐ฝ, ๐ฃ โซ๏ธ โฎ๏ธ ๐ "shutdown"
:
from fastapi import FastAPI
app = FastAPI()
@app.on_event("shutdown")
def shutdown_event():
with open("log.txt", mode="a") as log:
log.write("Application shutdown")
@app.get("/items/")
async def read_items():
return [{"name": "Foo"}]
๐ฅ, shutdown
๐ ๐โ๐ฆบ ๐ข ๐ โ โ โธ "Application shutdown"
๐ log.txt
.
Info
open()
๐ข, mode="a"
โ "๐ป",, โธ ๐ ๐ฎ โฎ๏ธ โซ๏ธโ ๐ ๐ ๐, ๐ต ๐ โฎ๏ธ ๐.
Tip
๐ ๐ ๐ ๐ผ ๐ฅ โ๏ธ ๐ฉ ๐ open()
๐ข ๐ ๐ โฎ๏ธ ๐.
, โซ๏ธ ๐ ๐ค/๐ พ (๐ข/๐ข), ๐ ๐ "โ" ๐ โ ๐พ.
โ๏ธ open()
๐ซ โ๏ธ async
& await
.
, ๐ฅ ๐ฃ ๐ ๐โ๐ฆบ ๐ข โฎ๏ธ ๐ฉ def
โฉ๏ธ async def
.
Info
๐ ๐ช โ ๐ ๐ ๐ซ ๐ ๐โ๐ฆบ ๐ ๐' ๐ฉบ.
startup
& shutdown
๐ฏโโ๏ธ¶
๐ค โ ๐ค ๐ โ ๐ ๐ด & ๐คซ ๐, ๐ ๐ช ๐ โถ๏ธ ๐ณ & โคด๏ธ ๐ โซ๏ธ, ๐ โน & โคด๏ธ ๐ โซ๏ธ, โ๏ธ.
๐จ ๐ ๐ฝ ๐ข ๐ ๐ซ ๐ฐ โ โ๏ธ ๐ข ๐ฏโโ๏ธ ๐ โ ๐ ๐ ๐ช ๐ช ๐ฒ ๐ ๐ข โ๏ธ ๐ ๐ฑ.
โฉ๏ธ ๐, โซ๏ธ ๐ ๐ โฉ๏ธ โ๏ธ lifespan
๐ฌ ๐.
๐ก โน¶
๐ก โน ๐ ๐ค. ๐ถ
๐, ๐ซ ๐ก ๐ง, ๐ ๐ ๐ ๐ ๏ธ, & โซ๏ธ ๐ฌ ๐ ๐ค startup
& shutdown
.
๐ง ๐ธ¶
๐ถ โ๏ธ ๐คฏ ๐ ๐ซ ๐ ๐ (๐ด & ๐คซ) ๐ ๐ด ๐ ๏ธ ๐ ๐ธ, ๐ซ ๐ง ๐ธ - ๐ป.