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

FastAPI / المتوسط: تكامل التطبيق والأمن / الدرس 7

التنفيذ غير المتزامن والعمل الحاجب

اختر الحد غير المتزامن والمتزامن حسب العملية واحفظ تجاوب الحلقة دون ادعاء تواز مفتوح.

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

أهداف الدرس

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

عدم التزامن نموذج تعاوني

تتيح async التعاون عند انتظار عملية مناسبة ولا تنقل كل عبارة لخيط أوتوازي الحساب. قد يحجب استدعاء مكتبة الحلقة داخل async. ينتظر المثال coroutine مضبوطة ويعيدها بعميل معزول ليشرح الملكية لا الإنتاجية. اختر بحسب API والكلفة لا إضافة async عادة.

python فحص عملية منتظرة كامل
import asyncio
from fastapi import FastAPI
from fastapi.testclient import TestClient
app = FastAPI()
async def calculate(value):
    await asyncio.sleep(0)
    return value * 2
@app.get("/double/{value}")
async def double(value: int):
    return {"value": await calculate(value)}
with TestClient(app) as client:
    print(client.get("/double/3").json())
الناتج المتوقع
{'value': 6}

تسلم coroutine التحكم وتعيد 6؛ وsleep(0) نقطة جدولة لا انتظار خارجي أوقياس أداء.

معرفة ما توزعه FastAPI

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

python فحص نقل صريح لخيط كامل
import threading
from fastapi import FastAPI
from fastapi.testclient import TestClient
from starlette.concurrency import run_in_threadpool
app = FastAPI()
@app.get("/offload")
async def offload():
    loop_thread = threading.get_ident()
    different = await run_in_threadpool(lambda: threading.get_ident() != loop_thread)
    return {"offloaded": different}
with TestClient(app) as client:
    print(client.get("/offload").json())
الناتج المتوقع
{'offloaded': True}

تثبت True اختلاف الخيط دون إدخال وإخراج أوادعاء إنتاجية وأمان عميل حقيقي.

مطابقة العملاء وملكية الموارد

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

تقييد التزامن قبل التوسع

قد تغرق coroutines القاعدة والخلفية والذاكرة والمجمع. يحد semaphore النشط وتحتاج المنتظرة والمهلة حدودا. قد يحتاج الحساب عملية أوعاملا ولا يسرع الخيط كل حمل. لا تولد حركة لإثبات الدرس؛ تحقق محليا ثم قس الممثل بإذن وسعة وتوقف واضحين.

تشخيص التجاوب بالدليل الصحيح

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

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

يحجب async بمساعد عادي

لماذا يحدث؟
افتُرض النقل التلقائي للمباشر.
كيف تصلحه؟
استخدم API مناسبة أوحدا صريحا.
كيف تتجنب تكراره؟
راجع السلسلة كلها.

تستنزف coroutines اعتمادية

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

يوعد المجمع بتوازي CPU

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

اختبر فهمك

1. يستدعى محرك متزامن مباشرة داخل async. ماذا تراجع؟

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

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

2. لماذا لا يحد semaphore الذاكرة الكلية بالضرورة؟

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

قد يحد النشط وتنتظر مهام وحمولات بلا حد. قيد القبول والطابور والحجم والموعد وحدد مورد كل حد.

أهم ما تعلمته

  • تتيح async التعاون عند انتظار عملية مناسبة ولا تنقل كل عبارة لخيط أوتوازي الحساب.
  • استخدم العميل المناسب مع await أوحدا متزامنا مقصودا، ولا تستدع asyncio.run داخل حلقة الطلب.
  • افصل حجب الحلقة وانتظار المجمع والاستعلام والشبكة والتسلسل والحمل.

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