Django / الصحة ودليل الإنتاج / الدرس 17
العروض غير المتزامنة والتخزين وملكية العمل
اختر التنفيذ وحدود التخزين دون اعتبار async أو إصابة المخزن ضمانا للصحة والديمومة.
في هذه الصفحة
أهداف الدرس
- اللاتزامن نموذج تنفيذ لا وعد سرعة
- تنفيذ عرض غير متزامن محدود محليا
- إبقاء العرض المخزن خلف التفويض الحقيقي
اللاتزامن نموذج تنفيذ لا وعد سرعة
تدعم 5.2 العروض وASGI مع تكييف WSGI، وتحدد الفائدة الوسائط والمتعاونون والعمل القابل للانتظار. يبقى CPU أو الحاجب شاغلا للخيط. لا تحول الجميع لبطء صفحة؛ قس وافحص النشر. يثبت asyncio المحلي النتيجة لا إنتاجية ASGI والاتصالات والإلغاء وكل وسيط. وقد يكيف WSGI العرض دون أن يمنحه خصائص منظومة ASGI كاملة، لذلك يجب أن يذكر تقرير الأداء الخادم والوسيط والمتعاونين الذين جرى قياسهم.
احترام حدود أمان القاعدة المتزامنة
تبقى أجزاء متزامنة أو بواجهات خاصة. استخدم الموثق ولا تسكت SynchronousOnlyOperation بمنفذ غير آمن. ليست المعاملة في 5.2 مجرد atomic غير متزامنة؛ يمكن تغليف وظيفة معاملية متزامنة بمكيف مناسب وعقد خيطه. أبق المعاملة كاملة داخله ولا تمرر الاتصالات عشوائيا. راجع العمر والتجميع للنشر الفعلي. ويجب أن تبقى المعاملة المتزامنة كاملة داخل الوظيفة المكيفة، وألا تمرر اتصال القاعدة عبر خيوط مختلفة بافتراض أن واجهة async تصلح ذلك تلقائيا.
تنفيذ عرض غير متزامن محدود محليا
ينتظر البرنامج نقطة جدولة مصطنعة ويعيد JSON دون شبكة وخادم وقاعدة، فيثبت الاستدعاء المنتظر. يحتاج الحقيقي مهلا وحد تزامن وتنظيفا وسياسة أثر مجهول. لا تجعل مهمة منفصلة داخل الطلب دائمة فقد يقطعها العامل. استخدم نظام وظائف وعقد تسليم مدعومين لما يتجاوز العمر. ولا يصبح العمل المفصول عن الطلب دائمًا لمجرد إنشائه كمهمة، فقد يوقفه إغلاق العامل قبل أن يصل إلى أثر يحتاجه المستخدم.
from django.conf import settings
settings.configure(
SECRET_KEY="synthetic-course-key",
USE_I18N=False, USE_TZ=True,
INSTALLED_APPS=[],
DATABASES={"default": {"ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:"}},
DEFAULT_AUTO_FIELD="django.db.models.AutoField",
ALLOWED_HOSTS=["testserver"],
)
import django
django.setup()
import asyncio
import json
from django.http import JsonResponse
from django.test import RequestFactory
async def status(request):
await asyncio.sleep(0)
return JsonResponse({"state": "ready"})
response = asyncio.run(status(RequestFactory().get("/status/")))
print(response.status_code, json.loads(response.content)["state"])
200 ready
يثبت الانتظار نتيجة محلية لا يقيس ASGI منشورة ولا يتصل بمتعاون.
يحتاج المخزن هوية وحداثة وإبطالا
يحسب المثال قيمة مرة في قراءتين متتاليتين، لا ضمان مرة واحدة موزعا. المخزن محلي العملية لا حقيقة مشتركة لكل العمال. ضمن أبعاد النتيجة كالمستأجر والإذن بالمفتاح وطابق المهلة بالحداثة ولا تخلط الخاص بعام. لا تلغي get_or_set التفكير بالتنافس والانهيال والفشل والقدم. وقد تحسب محاولتان متزامنتان القيمة نفسها عند غيابها، لذلك لا ينبغي تفسير تجربة القراءتين المتتاليتين كضمان تنفيذ موزع مرة واحدة.
from django.conf import settings
settings.configure(
SECRET_KEY="synthetic-course-key",
USE_I18N=False, USE_TZ=True,
INSTALLED_APPS=[],
DATABASES={"default": {"ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:"}},
DEFAULT_AUTO_FIELD="django.db.models.AutoField",
ALLOWED_HOSTS=["testserver"],
)
import django
django.setup()
from django.core.cache import cache
from django.test import override_settings
calls = []
def calculate():
calls.append("called")
return "Django"
configuration = {"default": {"BACKEND": "django.core.cache.backends.locmem.LocMemCache", "LOCATION": "synthetic-course-cache"}}
with override_settings(CACHES=configuration):
print(cache.get_or_set("public-course:v1", calculate, timeout=30))
print(cache.get_or_set("public-course:v1", calculate, timeout=30))
print(len(calls))
Django
Django
1
يستخدم مخزنا مصطنعا محليا وتحسب قراءتان متتاليتان مرة بهذه العينة.
إبقاء العرض المخزن خلف التفويض الحقيقي
يسرع التخزين نتيجة ولا يفوضها. قيد وانشر وخطط إبطال الصلاحية، وقد يتقادم العدد بينما تحتاج السعة دقة؛ فليكن الثابت بالقاعدة لا حجزا من مخزن. اختبر الغياب والإصابة والمهلة والإبطال والفشل بعزل واستخدم 5.2 لا افتراض ميزات إصدار أحدث. وقد تتغير الصلاحية بعد تخزين رد، لذلك يجب أن تتضمن سياسة الإبطال أو فصل المفاتيح طريقة تمنع تقديم محتوى كان مأذونا في سياق سابق فقط.
الأخطاء الشائعة وإصلاحها
يحجب async العمل
- لماذا يحدث؟
- ينفذ متزامنا مكلفا بالخيط.
- كيف تصلحه؟
- استخدم واجهة أو حد تنفيذ مناسب.
- كيف تتجنب تكراره؟
- قس المسار الفعلي.
تختلف العمال بقيمة مشتركة مفترضة
- لماذا يحدث؟
- المخزن لكل عملية.
- كيف تصلحه؟
- اختر مشتركا عند الحاجة.
- كيف تتجنب تكراره؟
- وثق النطاق لا الاسم فقط.
تسرب الإصابة رد مستأجر آخر
- لماذا يحدث؟
- أغفل المفتاح بعد الهوية.
- كيف تصلحه؟
- صحح وأبطل غير الآمن.
- كيف تتجنب تكراره؟
- اختبر الأشخاص وتغير الإذن.
اختبر فهمك
1. هل يثبت asyncio.run خدمة غير متزامنة كفؤة؟
اعرض الحل المشروح
لا؛ يثبت النتيجة المحلية وتبقى طبقات الخادم والوسيط والاتصال والإلغاء والحمل. تحقق منها بعزل وقس قبل ادعاء الفائدة.
2. لماذا لا يعتمد خصم دقيق على عدد مخزن؟
اعرض الحل المشروح
قد يتقادم أو يختلف بين العمال. افرض الحالي بالقاعدة والمعاملة والشرط. يفيد المخزن العرض لا الحجز أو الانتقال الموثوق.
أهم ما تعلمته
- يتطلب async مراجعة المسار كله.
- نطاق المخزن وحداثته عقدان.
- تحتاج الديمومة نظاما مالكا.