بیایید به این قضیه اعتراف کنیم که جنگو بهترین انتخاب ما به عنوان یک فریمورک همه کاره در زمینه توسعه سمت سرور است. به نسبت دیگر رُقبا (لاراول و روبیآنریلز) جنگو سرعت توسعه بسیار بالاتری داشته و در زمان اجرا نیز به نسبت این موارد سریعتر عمل میکند. از طرف دیگری زبان برنامهنویسی که جنگو از آن بهره میگیرد پایتون است که در زُمره محبوبترین و پر استفادهترین زبانهای برنامهنویسی دنیا است.
زمانی که برای اولین بار اپلیکیشن جنگو را اجرا میکنید متوجه این خواهید بود که سرعت اجرا پروژه شما بالا بوده و به راحتی میتواند اجرا شود. اما با گذر زمان و با افزایش حجم دادهها و کوئری گرفتنهای بسیار زیاد همه چیز سنگینتر شده و مطمئنا حس خواهید کرد که برای انجام کارهای مختلف همه چیز کُندتر از حالت معمول شده است.
اما در نهایت مقصر این موضوع فریمورک جنگو نیست بلکه ما به عنوان برنامهنویسان جنگو خواهیم بود. ما به عنوان افرادی که از جنگو استفاده میکنیم به شکلهایی اشتباه به مفاهیم جنگو فکر میکنیم. برای مثال میگوییم:
- Django ORM خیلی باحاله! بهتره توی هر شرایطی ازش استفاده کنم.
- Viewها جای خوبی برای انجام تمام محاسبات من هستند پس همه کارها رو اونجا انجام میدم.
- کدها رو ریفاکتور نمیکنم جنگو خودش حرفهای و مدیریت شده کدها رو نگهداری میکنه.
- و... .
تمام سناریوهای بالا حالتهایی هستند که ابدا پیشنهاد نشده و جنگو هم شدیدا ما را از برخورد به این شکل منع میکند.
در این مقاله اختصاصی از وبسایت راکت قصد داریم شما را با حالتهایی آشنا کنیم که با رعایت کردن آنها میتوانید اپلیکیشنهای سریعتری با استفاده از فریمورک جنگو بنویسید و دیگر در این زمینهها مشکلی نداشته باشید.
نکته اول: میزان کوئریهایتان را کمتر کنید
یکی از موضوعاتی که ما معمولا آن را فراموش میکنیم این است که انجام هر کوئری میتواند منجر به بالا بردن زمان مورد نیاز برای اجرای نرمافزارمان شود. البته کوئریهای ساده مانند یک دستور Select از پیچیدگی کمی برخوردار است اما زمانی که آن را با عملیاتهایی مانند Filter ادغام میکنید همه چیز پیچیدهتر از پیش میشود و در نتیجه باعث کُندی بیش از اندازه در نرم افزارها خواهد شد.
ORM همواره مقدار کمتری کد برای نوشتن نیاز دارد اما در نهایت این ORM نیست که با دیتابیس صحبت میکند بلکه کدهای SQL است. زمانی که شما ORM مینویسید شاید فکر کنید که تمام کدهای شما چند کلمه است و در یک خط قرار گرفته اما زمانی که SQL واقعی همان کد را نگاه کنید متوجه میشوید که همه چیز پیچیدهتر بوده و برای اجرا دستور شما زمان و کارایی بیشتری نسبت به آنچه که شما به آن فکر میکردید نیاز است.
به همین دلیل شما باید کوئریهایی که میگیرید را مدام دیباگ کرده و تغییرات داخل آن را بررسی کنید. یک راهکار مناسب برای ردیابی این دسته از کدها استفاده از ابزاری مانند Django Debug Toolbar است.
این ابزار یک پنل مدیریتی بسیار کاربردی است که در آن به شما میزان کوئریها و مدت زمان اجرایشان را میدهد. در کنار آن میتوانید گزارشی کامل از اینکه هر کوئری چه کاری را انجام میدهد نیز دریافت کنید.
نکته دوم: Celery را فراموش نکنید
تفاوت برنامهنویسان عادی با برنامهنویسان حرفهای در این است که برنامهنویسان عادی با اجرای دقیق درخواستها آشنایی ندارند و نمیدانند که جنگو به تنهایی نمیتواند همه درخواستها را به صورت سریع در اختیار کاربران قرار دهد. به همین دلیل گاهی اوقات نیاز است که برنامهنویسان بتوانند به صورت غیر همزمان کارها را هندل و مدیریت بکنند. برای مثال زمانی که نیاز دارید یک ایمیل را ارسال کنید، مقداری را در دیتابیس بروزرسانی کنید و یا موارد دیگر در این حالتها نیاز است که به صورت غیر همزمان وارد عمل شوید.
برای انجام بیشتر این کارها به شدت نیاز است که از کتابخانههایی مانند Celery استفاده کنید.
Celery یک ابزار برای مدیریت صف وظایف است که اصطلاحا در انگلیسی به آن Task Queue گفته میشود. در این ابزار روی بلادرنگ بودن انجام درخواستها تاکید میشود.
منظور از یک Task میتواند یک متد باشد که در یک آدرس یا اکشن خاص اجرا میشود که با استفاده از Celery میتواند به صورت غیرهمزمان انجام شود. کاری که Celery انجام میدهد این است که چندین ورکر را برای انجام کارهای مختلف به صورت همزمان اجرا میکند که به صورت پیشفرض تعداد این ورکرها ۴ مورد است. زمانی که یک متد خاص اجرا میشود اولین ورکر در دسترس متد را در دسترس گرفته و آن را اجرا میکند. اگر چندین متد به صورت همزمان اجرا شود وظیفه اجرا هر کدام به بخشی از این ورکرها داده خواهد شد و در نتیجه همه موارد میتوانند در سریعترین زمان ممکن اجرا شود.
ورکرها به عنوان یک سرویس خارجی کار میکنند و هیچ تاثیری در توسعه اپلیکیشن اصلی شما نخواهند گذاشت. در نتیجه نگران این وضعیت نباید باشید.
نکته سوم: خود را تکرار نکنید
هیچ چیز برای یک ساختار به این اندازه سمی نیست که کدهای تکراری در آن وجود داشته باشد! همواره این موضوع را به یاد داشته باشید، اگر قصد دارید از یک قطعه کد دوباره استفاده کنید آن را دوبار ننویسید میتوانید آن را در یک ماژول یا تابع ذخیره کرده و فراخوانی کنید. با نوشتن دوباره یک قطعه کد تنها برنامه شما بزرگتر و کندتر خواهد شد و بر حجم پیچیدگی آن افزوده میشود.
برای آنکه بتوانید بهترین رویکرد را در این زمینه داشته باشید همواره از مستندات جنگو استفاده بکنید. مستندات جنگو به شما این قابلیت را میدهند تا بتوانید به بهترین نحو برنامه خود را نوشته و از استانداردهای موجود استفاده بکنید. در صورتی که یک جنگو کار مبتدی هستید حتما به مستندات جنگو سر زده و بخشهای مختلف آن را مطالعه کنید.
همچنین تا جایی که میتوانید سعی کنید متدهای اجرایی در __init__ را در کمترین مقدار قرار دهید. اگر متدی دارید که نیاز به اجرا شدن دارد و حجم زیادی از اطلاعات را پردازش میکند بهتر است در __init__ از آن استفاده نکرده و در یک منبع دیگر از آن بهرهگیری کنید.
نکته چهارم: کشینگ
اگر متدی دارید که دیتاهای خروجی آن برای مدت طولانی است که تغییری نداشته از تکنیک کشینگ استفاده کنید. جنگو به صورت داخلی یک سطح پایین از کشینگ را برای شما ایجاد کرده که به شما اجازه میدهد دیتاهایی را در آن ذخیره کنید. خوشبختانه کار با آن بسیار ساده بوده و پیچیدگی خاصی در آن دیده نمیشود. به قطعه کد زیر نگاه کنید:
from django.core.cache import cache
cache.set('my_key', 'hello, world!', 30)
cache.get('my_key')
cache.clear()
با استفاده از کشینگ شما میتوانید به صورت بسیار ساده دیتاهای مورد نظر کاربر را در اختیار وی قرار دهید و دیگر کاربر را برای انجام پردازش درخواستها منتظر نگذارید.
در پایان: از جنگو لذت ببرید
جنگو فریمورک بسیار قدرتمند و بزرگی است که تواناییهای بسیار زیادی داشته و حقیقتا یادگیری تمام تکنیکهای آن مدت زمان زیادی را نیاز دارد. در هر صورت بهتر است که قبل از اینکه وارد توسعه اپلیکیشنهای حیاتی با جنگو شوید با کاربردهای آن آشنایی پیدا کنید و درک عمیقی از جنبههای مختلف آن داشته باشید.
دیدگاه و پرسش
در حال دریافت نظرات از سرور، لطفا منتظر بمانید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید