محتويات الدورة

FastAPI / المتقدم: الحياة وتصميم خدمة موثوقة / الدرس 13

دورة الحياة والتنظيف مع yield

اسند موارد التطبيق والطلب لأعمار صريحة وتحقق من توقيت التنظيف حول التدفق.

وقت القراءة التقريبي: 3 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • اشرح افتراضات وحدود موضوع «دورة الحياة والتنظيف مع yield».
  • فسر المثالين الكاملين وعلل المخرجات الملاحظة.
  • شخص الإخفاقات وطبق الحلول المشروحة مع وضوح ملكية الهوية والحالة ودورة الحياة.

تحتاج موارد التطبيق مالك تطبيق

قد يعيش عميل أومجمع بعمر التطبيق وتوفر lifespan سياق الأخذ والتنظيف. يسجل المثال دخولا وخروجا بحالة اصطناعية حول العميل. فضل النمط الموثق لا خلط خطافات قديمة وافتراض ترتيب. لا تعلن الجاهزية عند فشل الأخذ وحدد مالك كل مورد وتنظيفا محدودا ملاحظا.

python فحص حياة تطبيق كامل
from contextlib import asynccontextmanager
from fastapi import FastAPI
from fastapi.testclient import TestClient
events = []
@asynccontextmanager
async def lifespan(app):
    events.append("startup")
    app.state.catalog = {"count": 2}
    try:
        yield
    finally:
        events.append("shutdown")
app = FastAPI(lifespan=lifespan)
@app.get("/catalog")
def catalog(): return app.state.catalog
with TestClient(app) as client:
    print(client.get("/catalog").json(), events.copy())
print(events)
الناتج المتوقع
{'count': 2} ['startup']
['startup', 'shutdown']

يسبق البدء الطلب ويلي الإغلاق السياق بملكية قاموس وقائمة فقط.

توضيح نطاق العامل والعملية

تخص الحالة التطبيق والعملية ولا تتشارك العمال القاموس والقفل والمجمع تلقائيا، وقد يبدأ كل عامل مستقلا. ليست الذاكرة مخزنا موزعا أوهوية دائمة وحيدة. أبعد الاعتمادات والخارج عن التعليم، واختبر الحياة بلا مشروع ووثق أخذ وتحديث وإغلاق موارد النشر المعتمدة.

تملك التبعية المسلمة تنظيف الطلب

تأخذ yield موردا وتسلمه وتحرره في finally مع الخطأ والإلغاء. يحدد النطاق التوقيت بالإصدار المثبت لا المثال القديم. تقارن الشيفرة الطلب والدالة بأعلام وتدفق اصطناعي بلا ملفات أوقاعدة أوشبكة، لتبين توفر المورد لا أفضلية نطاق للجميع.

python فحص نطاق تنظيف التدفق كامل
from typing import Annotated
from fastapi import Depends, FastAPI
from fastapi.responses import StreamingResponse
from fastapi.testclient import TestClient
async def resource():
    state = {"open": True}
    try:
        yield state
    finally:
        state["open"] = False
async def body(state):
    yield "open" if state["open"] else "closed"
app = FastAPI()
@app.get("/request-scope")
async def request_scope(state: Annotated[dict, Depends(resource)]):
    return StreamingResponse(body(state))
@app.get("/function-scope")
async def function_scope(state: Annotated[dict, Depends(resource, scope="function")]):
    return StreamingResponse(body(state))
with TestClient(app) as client:
    print(client.get("/request-scope").text)
    print(client.get("/function-scope").text)
الناتج المتوقع
open
closed

يحفظ الطلب المورد الاصطناعي أثناء التدفق وتغلقه الدالة قبله؛ والعرض للتوقيت لا تنفيذ مورد فعلي.

مطابقة العمر لاستخدام الرد

قد يكسر الإغلاق المبكر التدفق المعتمد عليه، وقد يضر إبقاء معاملة نادرة لتدفق طويل بعد نسخ البيانات. تسمح الدالة بالتحرير قبل الإرسال ويحفظ الطلب عبر المعالجة وفق العقد. التثبيت قرار آخر فلا تؤخره لما بعد النجاح، وللخلفية مدخل وموارد خاصة لا جلسة منتهية.

التحقق من التنظيف بالنجاح والفشل

استخدم سياق العميل وافحص البدء والحالة والإغلاق، وأدر الحياة صراحة مع النقل async. اختبر فشل الأخذ والمعالج والتدفق والتنظيف بأمان واحفظ الأصلي. لا خادم أوخارج هنا، والتوقيت خاص بالأساس ويتحقق بعد التحديث. تنشأ السلامة من عمر وملكية مفهومة لا yield وfinally شكليتين.

الأخطاء الشائعة وإصلاحها

يقرأ التدفق موردا مغلقا

لماذا يحدث؟
انتهى العمر قبل الاستهلاك.
كيف تصلحه؟
طابق النطاق أوانسخ اللازم.
كيف تتجنب تكراره؟
اختبر الاستهلاك وترتيب التنظيف.

يفترض اشتراك العمال بالعام

لماذا يحدث؟
اختلطت الذاكرة بالحفظ الموزع.
كيف تصلحه؟
استخدم عقدا دائما مناسبا عند الحاجة.
كيف تتجنب تكراره؟
وثق البدء والملكية لكل عملية.

تغفل الاختبارات البدء وتتوقع الحالة

لماذا يحدث؟
اختلط النقل والحياة.
كيف تصلحه؟
شغل تجهيز الحياة صراحة.
كيف تتجنب تكراره؟
افحص الأخذ والتنظيف مستقلين.

اختبر فهمك

1. ينسخ المعالج كل اللازم قبل التدفق. هل تبقى الجلسة حتى نهايته؟

اعرض الحل المشروح

ليس بالضرورة؛ فقد يحمي التحرير المبكر السعة. اختر واختبر النطاق وأكمل المعاملة قبل النجاح.

2. لماذا لا تلتقط الخلفية جلسة طلب؟

اعرض الحل المشروح

قد تتجاوز عمرها وتلقى مغلقة أوغير آمنة. مرر معرفات ثابتة وأنشئ موارد مملوكة بالمهمة أوالعامل واختبرها مستقلة.

أهم ما تعلمته

  • قد يعيش عميل أومجمع بعمر التطبيق وتوفر lifespan سياق الأخذ والتنظيف.
  • تأخذ yield موردا وتسلمه وتحرره في finally مع الخطأ والإلغاء.
  • استخدم سياق العميل وافحص البدء والحالة والإغلاق، وأدر الحياة صراحة مع النقل async.

المراجع الرسمية