نصائح سريعة: كيفية تسريع تطبيقات جانغو

0

 دليل قصير لتحسين الأداء في تطبيقات جانغو

تجنب استخدام Django Model Serializer

يسمح إطار عمل Django للمطورين بشحن التطبيقات بسرعة. تسمح Django Serializers بتحويل البيانات المعقدة مثل مجموعات الاستعلام ومثيلات النماذج إلى أنواع بيانات Python الأصلية. ومع ذلك، يأتي Modelserializer بتكلفة من حيث الأداء الضعيف من نقاط النهاية التي تستخدم serializer. هذا الأداء الضعيف شائع، خاصة عند العمل مع مجموعات بيانات كبيرة. يُنصح بكتابة serializers، أو تعيين حقول غير قابلة للكتابة للقراءة فقط، أو تخزين مثيلات النموذج مؤقتًا.

استخدم المولدات

لا تحاول كتابة التكرارات الخاصة بك؛ استخدم دالة generator() لجعل تكراراتك أسرع. على سبيل المثال، يعد استخدام المولدات هو الحل الأفضل إذا كنت بحاجة إلى إنشاء كمية كبيرة من القيم.

الطلبات غير المتزامنة

البرمجة المتزامنة هي حيث تكون المهام متسلسلة. تتبع جميع المهام ترتيبًا معينًا؛ وهذا يعني أن كل مهمة تتم من البداية إلى النهاية قبل أن تبدأ المهمة التالية.

من عيوب البرمجة المتزامنة أنه إذا استغرق تنفيذ مهمة معينة وقتًا أطول بكثير، فيجب أن تنتظر المهام السابقة حتى تكتمل المهمة؛ وهذا يسبب التأخير.

ومع ذلك، تعني البرمجة غير المتزامنة أن المهام يمكن أن تتزامن دون انتظار انتهاء المهام الأخرى من التنفيذ.

يُستخدم الاتصال غير المتزامن بشكل أساسي في تطبيقات الدردشة بالإضافة إلى التطبيقات التي تعرض البيانات في الوقت الفعلي.

توفر البرمجة غير المتزامنة الوقت عند جلب البيانات من واجهة برمجة التطبيقات (API). عادةً ما يستغرق جلب البيانات من واجهة برمجة التطبيقات (API) أو تقديم طلب http وقتًا أطول من المتوقع؛ بدلاً من انتظار اكتمال طلب http، يمكنك تطبيق دالة غير متزامنة على استدعاء http.

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

لنفترض أن لديك تطبيقًا يطلب عدة مرات من خادم API خارجي؛ مع البرمجة المتزامنة، سيتعين على التطبيق الانتظار حتى تكمل واجهة برمجة التطبيقات (api) المتابعة طلب HTTP وتعيد الاستجابة، مما يجعل تطبيقك بطيئًا.

على سبيل المثال، لنفترض أننا نريد طلب واجهة برمجة تطبيقات خارجية مثل واجهة برمجة تطبيقات الطقس؛ دعونا نقارن الوقت الذي يستغرقه استخدام المكالمات المتزامنة وغير المتزامنة.

ستبدو الوظيفة المتزامنة هكذا

1
2
3
4
5
6
7
8
9
10
11
12
13
import requests
import time
 
key = 'secret-key'
start = time.time()
def get_weather(cities):
    for city in cities:
        url = 'http://api.weatherapi.com/v1/current.json?key='+key+'&q='+ city+'&aqi=no'
        weather = requests.get(url)
        print( weather.json()['current']['temp_c'],time.time() -start)
 
         
get_weather(['london','Paris','Bangkok','Dubai','Singapore','Rome'])

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

سيكون الطقس الحالي والوقت الإجمالي المستغرق للاستعلام عن واجهة برمجة التطبيقات لكل مدينة على النحو التالي:

1
2
3
4
5
6
18.0 0.74
23.0 1.15
28.0 1.56
41.0 1.96
29.0 2.37
40.0 2.78

دعونا نعيد كتابة الوظيفة أعلاه بمساعدة httpx. Httpx هو عميل python يدعم طلبات HTTP المتزامنة وغير المتزامنة.

قم أولاً بتثبيت العميل:

1
pip install httpx

بعد ذلك، اكتب وظيفة المزامنة التي تبدو كما يلي:

1
2
3
4
5
6
7
8
9
10
11
12
import asyncio
import httpx
import time
start = time.time()
async def get_weather(cities):
    key = 'api-key'
    async with httpx.AsyncClient() as client:
        for city in cities:
            url = 'http://api.weatherapi.com/v1/current.json?key='+key+'&q='+ city+'&aqi=no'
            weather_data = await client.get(url)
            print(weather_data.json()['current']['temp_c'],time.time() -start)
asyncio.run(get_weather(['london','Paris','Bangkok','Dubai','Singapore','Rome']))

الطقس الحالي وإجمالي الوقت المستغرق للاستعلام عن الطقس لكل مدينة سيكون:

1
2
3
4
5
6
16.0 0.47
23.0 0.70
28.0 0.90
41.0 1.11
29.0 1.31
40.0 1.52

كما ترون، أعلاه يستغرق حوالي نصف الوقت الذي تستغرقه الوظيفة المتزامنة، (أي 1.52 مقابل 2.78) وهو تحسن كبير في الأداء.