💎 کالبک ها در جاوا اسکریپت 💎
امروز میخوایم یکی از مفهوم های خیلی مهم و کاربردی در جاوا اسکریپت رو با هم بررسی کنیم: کالبک ها (callbacks).
شاید اولش یه کم پیچیده به نظر برسه، اما نگران نباشید! با مثال های ساده و کاربردی، این مفهوم رو براتون خیلی روشن میکنم.
کالبک چیه؟ ❓
کالبک در واقع یه تابعه که به عنوان آرگومان به تابع دیگه ای پاس داده میشه. یعنی یه تابع رو میگیریم و به جای اینکه خودمون مستقیماً اونو اجرا کنیم، به تابع دیگه ای میدیم تا در زمان مناسب خودش اونو صدا بزنه.
چرا به کالبک نیاز داریم؟ ❓
فرض کن میخوای یه عملیات خاصی رو انجام بدی، اما میخوای بعد از اینکه این عملیات تموم شد، یه کار دیگه ای هم انجام بشه. اینجا دیگه کالبک ها به دادمون میرسن.
با استفاده از کالبک ها میتونیم بگیم که بعد از اینکه عملیات اول تموم شد، کدهایی که داخل کالبک نوشته شده، اجرا بشه.
مثال ساده:
در این مثال:
تابع greet دو آرگومان میگیره: یک نام و یک کالبک.
بعد از چاپ سلام، تابع callback رو صدا میزنه که در این مثال sayGoodbye هست.
پس خروجی این کد میشه:
✅ مثال کاربردی تر:
در این مثال: ⬇️
1⃣ تابع fetchData داده رو از یک آدرس اینترنتی دریافت میکنه.
2⃣ بعد از دریافت داده، تابع callback رو با داده دریافت شده صدا میزنه.
3⃣ و displayData به عنوان کالبک استفاده شده و داده رو در کنسول چاپ میکنه.
👀 کاربردهای کالبک ها:
⏱ تابع های ناهمزمان: برای مدیریت عملیات هایی که زمان بر هستند مثل درخواست های HTTP، تایمرها و ...
📅 رویدادها(Events): در رویدادهایی مثل کلیک کردن روی یک دکمه، بارگذاری یک صفحه و ...
🗂 کتابخانه ها و فریمورک ها: خیلی از کتابخانه ها و فریمورک های جاوا اسکریپت از کالبک ها استفاده میکنن.
✅ جمع بندی:
کالبک ها یه ابزار قدرتمند در جاوا اسکریپت هستن که بهتون اجازه میدن کدهایتون رو به صورت ناهمزمان و رویداد محور بنویسید. با تمرین و ممارست، میتونید به راحتی از کالبک ها در پروژه های خودتون استفاده کنید.
#javascript #callback #programing
امروز میخوایم یکی از مفهوم های خیلی مهم و کاربردی در جاوا اسکریپت رو با هم بررسی کنیم: کالبک ها (callbacks).
شاید اولش یه کم پیچیده به نظر برسه، اما نگران نباشید! با مثال های ساده و کاربردی، این مفهوم رو براتون خیلی روشن میکنم.
کالبک چیه؟ ❓
کالبک در واقع یه تابعه که به عنوان آرگومان به تابع دیگه ای پاس داده میشه. یعنی یه تابع رو میگیریم و به جای اینکه خودمون مستقیماً اونو اجرا کنیم، به تابع دیگه ای میدیم تا در زمان مناسب خودش اونو صدا بزنه.
چرا به کالبک نیاز داریم؟ ❓
فرض کن میخوای یه عملیات خاصی رو انجام بدی، اما میخوای بعد از اینکه این عملیات تموم شد، یه کار دیگه ای هم انجام بشه. اینجا دیگه کالبک ها به دادمون میرسن.
با استفاده از کالبک ها میتونیم بگیم که بعد از اینکه عملیات اول تموم شد، کدهایی که داخل کالبک نوشته شده، اجرا بشه.
مثال ساده:
function greet(name, callback) { console.log(`سلام ${name}!`); callback(); } function sayGoodbye() { console.log("خداحافظ!"); } greet("علی", sayGoodbye);
در این مثال:
تابع greet دو آرگومان میگیره: یک نام و یک کالبک.
بعد از چاپ سلام، تابع callback رو صدا میزنه که در این مثال sayGoodbye هست.
پس خروجی این کد میشه:
سلام علی!
خداحافظ!
✅ مثال کاربردی تر:
function fetchData(url, callback) { // کدهایی برای دریافت داده از یک آدرس اینترنتی // ... callback(data); // بعد از دریافت داده، کالبک رو با داده دریافت شده صدا میزنه } function displayData(data) { console.log(data); } fetchData("https://api.example.com/data", displayData);
در این مثال: ⬇️
1⃣ تابع fetchData داده رو از یک آدرس اینترنتی دریافت میکنه.
2⃣ بعد از دریافت داده، تابع callback رو با داده دریافت شده صدا میزنه.
3⃣ و displayData به عنوان کالبک استفاده شده و داده رو در کنسول چاپ میکنه.
👀 کاربردهای کالبک ها:
⏱ تابع های ناهمزمان: برای مدیریت عملیات هایی که زمان بر هستند مثل درخواست های HTTP، تایمرها و ...
📅 رویدادها(Events): در رویدادهایی مثل کلیک کردن روی یک دکمه، بارگذاری یک صفحه و ...
🗂 کتابخانه ها و فریمورک ها: خیلی از کتابخانه ها و فریمورک های جاوا اسکریپت از کالبک ها استفاده میکنن.
✅ جمع بندی:
کالبک ها یه ابزار قدرتمند در جاوا اسکریپت هستن که بهتون اجازه میدن کدهایتون رو به صورت ناهمزمان و رویداد محور بنویسید. با تمرین و ممارست، میتونید به راحتی از کالبک ها در پروژه های خودتون استفاده کنید.
#javascript #callback #programing
🔥2
#پست_جدید
💎کوئری ست های بهینه در جنگو 💎
تا حالا شده برنامهتون مثل لاکپشت باشه و شما هم هی سر به دیوار بکوبید که چرا اینقدر کند شده؟ 😖
یکی از دلایلی که ممکنه سرعت برنامهتون رو کم کنه، کوئری ست های پیچیده و طولانی از دیتابیس هست. اما نگران نباشید! امروز میخوایم با همدیگه یه سری ترفند رو یاد بگیریم که کوئری ست هامون رو تو جنگو رو خیلی سریع کنیم.
❓کوئری ست چیه و چرا مهه؟
کوئری ست یه جور جعبه هست که توش یه مشت اطلاعات از دیتابیس جمع میشه. مثلاً میخواییم همه محصولاتی که قیمتشون زیر 100 تومنه رو پیدا کنیم. QuerySet این کارو برامون انجام میده.
❓ حالا چرا QuerySet اینقدر مهمه؟
چون نحوه ساختن این جعبه ، مستقیم روی سرعت برنامهمون تاثیر داره. اگه درست ساخته بشه، برنامهمون مثل برق کار میکنه و اگه اشتباه ساخته بشه، برنامهمون مثل لاکپشت میشه!
✅ ترفندهایی برای کوئری ست ها با سرعت بالا
🅰 فقط اون چیزی رو بگیر که نیاز داری:
1️⃣ استفاده از ()only و ()defer:
فرض کن یه محصول کلی اطلاعات داره، از رنگش گرفته تا مدلش. اما تو فقط به اسم و قیمتش نیاز داری. با استفاده از ()only فقط همون اطلاعاتی که نیاز داری رو از دیتابیس بخون.
2️⃣ اجتناب از ()select_related و ()prefetch_related بیجا:
این دو تا مثل یه پل بین دو تا جدول هستن. اما اگه بیجا ازشون استفاده کنیم، کوری ست پیچیده میشه و سرعت برنامهمون کم میشه.
🅱 فیلتر کردن رو حرفه ای انجام بده:
1️⃣ فیلترهای منطقی: از فیلترهای and و or برای پیدا کردن دقیقتر اطلاعات استفاده کن.
3️⃣ فیلترهای تاریخ و زمان: برای پیدا کردن اطلاعاتی که تاریخشون بین دو تاریخ خاصی هست، از فیلترهای مخصوص تاریخ و زمان استفاده کن.
4️⃣ به تنبل بودن کوئری ست ها (lazy queryset)دقت کن:
کوئری ست ها تا زمانی که نیاز نباشه ارزیابی نمیشن این یعنی تا وقتی که بخوای تعداد محصولاتی که پیدا کردی رو چاپ کنی، کوئری ست به دیتابیس ارسال نمیشه.
5️⃣ از Aggregation استفاده کن:محاسبه مجموع، میانگین و ... برای محاسبه اینجور چیزها از متدهای Aggregation مثل ()count(), sum(), avg استفاده کن.
6️⃣ ایندکسها رو فراموش نکن:
سرعت بخشیدن به جستجوها ایندکس مثل یه فهرست تلفنی برای دیتابیس هست. با ایجاد ایندکس روی فیلدهایی که زیاد روشون جستجو میکنی، سرعت جستجو رو خیلی زیاد میکنی.
🌡 مثال عملی
✅ جمع بندی
بهینه سازی QuerySet ها مثل اینه که یه ماشین مسابقه رو تیونینگ کنی. با رعایت این نکات ساده، برنامهت مثل برق کار میکنه و تو هم میتونی با خیال راحت به کارهای دیگه برسی.
⭕ نکته: همیشه سعی کن QuerySet ها رو مرحله به مرحله بنویسی و از ابزارهای دیباگ برای بررسی عملکردشون استفاده کنی.
#programing #django #queryset
💎کوئری ست های بهینه در جنگو 💎
تا حالا شده برنامهتون مثل لاکپشت باشه و شما هم هی سر به دیوار بکوبید که چرا اینقدر کند شده؟ 😖
یکی از دلایلی که ممکنه سرعت برنامهتون رو کم کنه، کوئری ست های پیچیده و طولانی از دیتابیس هست. اما نگران نباشید! امروز میخوایم با همدیگه یه سری ترفند رو یاد بگیریم که کوئری ست هامون رو تو جنگو رو خیلی سریع کنیم.
❓کوئری ست چیه و چرا مهه؟
کوئری ست یه جور جعبه هست که توش یه مشت اطلاعات از دیتابیس جمع میشه. مثلاً میخواییم همه محصولاتی که قیمتشون زیر 100 تومنه رو پیدا کنیم. QuerySet این کارو برامون انجام میده.
❓ حالا چرا QuerySet اینقدر مهمه؟
چون نحوه ساختن این جعبه ، مستقیم روی سرعت برنامهمون تاثیر داره. اگه درست ساخته بشه، برنامهمون مثل برق کار میکنه و اگه اشتباه ساخته بشه، برنامهمون مثل لاکپشت میشه!
✅ ترفندهایی برای کوئری ست ها با سرعت بالا
🅰 فقط اون چیزی رو بگیر که نیاز داری:
1️⃣ استفاده از ()only و ()defer:
فرض کن یه محصول کلی اطلاعات داره، از رنگش گرفته تا مدلش. اما تو فقط به اسم و قیمتش نیاز داری. با استفاده از ()only فقط همون اطلاعاتی که نیاز داری رو از دیتابیس بخون.
2️⃣ اجتناب از ()select_related و ()prefetch_related بیجا:
این دو تا مثل یه پل بین دو تا جدول هستن. اما اگه بیجا ازشون استفاده کنیم، کوری ست پیچیده میشه و سرعت برنامهمون کم میشه.
🅱 فیلتر کردن رو حرفه ای انجام بده:
1️⃣ فیلترهای منطقی: از فیلترهای and و or برای پیدا کردن دقیقتر اطلاعات استفاده کن.
3️⃣ فیلترهای تاریخ و زمان: برای پیدا کردن اطلاعاتی که تاریخشون بین دو تاریخ خاصی هست، از فیلترهای مخصوص تاریخ و زمان استفاده کن.
4️⃣ به تنبل بودن کوئری ست ها (lazy queryset)دقت کن:
کوئری ست ها تا زمانی که نیاز نباشه ارزیابی نمیشن این یعنی تا وقتی که بخوای تعداد محصولاتی که پیدا کردی رو چاپ کنی، کوئری ست به دیتابیس ارسال نمیشه.
5️⃣ از Aggregation استفاده کن:محاسبه مجموع، میانگین و ... برای محاسبه اینجور چیزها از متدهای Aggregation مثل ()count(), sum(), avg استفاده کن.
6️⃣ ایندکسها رو فراموش نکن:
سرعت بخشیدن به جستجوها ایندکس مثل یه فهرست تلفنی برای دیتابیس هست. با ایجاد ایندکس روی فیلدهایی که زیاد روشون جستجو میکنی، سرعت جستجو رو خیلی زیاد میکنی.
🌡 مثال عملی
from myapp.models import Product
# گرفتن همه محصولات با قیمت کمتر از 100000 تومان و فقط نمایش نام و قیمت
products = Product.objects.filter(price__lte=100000).only('name', 'price')
# محاسبه تعداد محصولات در هر دسته
product_counts = Product.objects.values('category').annotate(count=Count('id'))
✅ جمع بندی
بهینه سازی QuerySet ها مثل اینه که یه ماشین مسابقه رو تیونینگ کنی. با رعایت این نکات ساده، برنامهت مثل برق کار میکنه و تو هم میتونی با خیال راحت به کارهای دیگه برسی.
⭕ نکته: همیشه سعی کن QuerySet ها رو مرحله به مرحله بنویسی و از ابزارهای دیباگ برای بررسی عملکردشون استفاده کنی.
#programing #django #queryset
🔥9👍1😁1
💎توضیح Dirty Read، Non-Repeatable Read، Phantom Read و Deadlock 💎
خب بچهها امروز میخوایم درباره چند تا مشکل رایج توی تراکنشهای دیتابیس حرف بزنیم که ممکنه به دردتون بخوره. وقتی چند تا تراکنش به صورت همزمان توی دیتابیس کار میکنن، بعضی وقتا اتفاقای غیرمنتظرهای میافته که ممکنه به بینظمی و باگ منجر بشه. این مشکلات شامل Dirty Read، Non-Repeatable Read، Phantom Read و Deadlock هستن. بیاید دونه دونه بررسیشون کنیم.
اول Dirty Read 💾
خب Dirty Read یعنی وقتی یه تراکنش دادههایی رو میخونه که هنوز توسط یه تراکنش دیگه نهایی (commit) نشده. این یعنی شما دارید چیزی رو میخونید که ممکنه عوض بشه یا حتی برگرده.
مثال: فرض کن یکی توی اپلیکیشن شما داره اطلاعات یه سفارش رو تغییر میده ولی هنوز تغییرات رو ذخیره نکرده. حالا یه کاربر دیگه همون سفارش رو میبینه و تصمیم میگیره. اگر اون تغییرات نهایی نشن، اطلاعات اشتباهی به کاربر دوم رسیده.
دوم Non-Repeatable Read 🔄
خب Non-Repeatable Read وقتی پیش میاد که یه تراکنش، دادهای رو چند بار میخونه و دفعههای بعدی اون داده فرق میکنه، چون یه تراکنش دیگه اومده و اون داده رو وسط کار تغییر داده.
مثال: شما قیمت یه محصول رو برای یه مشتری نشون میدید. همزمان یه کاربر دیگه قیمت همون محصول رو تغییر میده. وقتی مشتری دوباره صفحه رو رفرش کنه، قیمت متفاوتی میبینه.
سوم Phantom Read 👻
خب Phantom Read یعنی وقتی یه تراکنش یه مجموعه داده رو میخونه و در طول اجرای تراکنش، رکوردهای جدیدی به اون مجموعه اضافه یا حذف میشن. اینطوری وقتی دوباره همون پرسوجو رو انجام بدی، نتیجه متفاوتی میبینی.
مثال: فرض کن یه مدیر داره تعداد کارمندای یک بخش رو چک میکنه. در همون لحظه یکی دیگه یه کارمند جدید به همون بخش اضافه میکنه. حالا اگر مدیر دوباره تعداد کارمندها رو ببینه، یه کارمند جدید میاد توی لیست که دفعه قبل نبوده.
چهارم Deadlock 🔐
خب Deadlock وقتی اتفاق میافته که دو یا چند تراکنش همزمان منتظر همدیگه بمونن و نتونن کاری کنن. یعنی تراکنشها همدیگه رو قفل میکنن و نمیتونن ادامه بدن.
مثال: فرض کن تراکنش A میخواد رکورد ۱ رو قفل کنه و منتظر رکورد ۲ هم هست. همزمان تراکنش B رکورد ۲ رو قفل کرده و منتظر رکورد ۱ هست. اینجا تراکنشها همدیگه رو بلاک کردن و هیچکدوم نمیتونن کاری بکنن.
جمع بندی 🎯
اینا مشکلات رایجی هستن که توی مدیریت تراکنشها و همزمانی توی دیتابیسها رخ میده. با فهمیدن و شناسایی این مشکلات میتونید از بروز مشکلات جدی توی سیستمهای دیتابیسی جلوگیری کنید و عملکرد بهتری داشته باشید.
امیدوارم مفید بوده باشه :)
@ninja_learn_ir
خب بچهها امروز میخوایم درباره چند تا مشکل رایج توی تراکنشهای دیتابیس حرف بزنیم که ممکنه به دردتون بخوره. وقتی چند تا تراکنش به صورت همزمان توی دیتابیس کار میکنن، بعضی وقتا اتفاقای غیرمنتظرهای میافته که ممکنه به بینظمی و باگ منجر بشه. این مشکلات شامل Dirty Read، Non-Repeatable Read، Phantom Read و Deadlock هستن. بیاید دونه دونه بررسیشون کنیم.
اول Dirty Read 💾
خب Dirty Read یعنی وقتی یه تراکنش دادههایی رو میخونه که هنوز توسط یه تراکنش دیگه نهایی (commit) نشده. این یعنی شما دارید چیزی رو میخونید که ممکنه عوض بشه یا حتی برگرده.
مثال: فرض کن یکی توی اپلیکیشن شما داره اطلاعات یه سفارش رو تغییر میده ولی هنوز تغییرات رو ذخیره نکرده. حالا یه کاربر دیگه همون سفارش رو میبینه و تصمیم میگیره. اگر اون تغییرات نهایی نشن، اطلاعات اشتباهی به کاربر دوم رسیده.
دوم Non-Repeatable Read 🔄
خب Non-Repeatable Read وقتی پیش میاد که یه تراکنش، دادهای رو چند بار میخونه و دفعههای بعدی اون داده فرق میکنه، چون یه تراکنش دیگه اومده و اون داده رو وسط کار تغییر داده.
مثال: شما قیمت یه محصول رو برای یه مشتری نشون میدید. همزمان یه کاربر دیگه قیمت همون محصول رو تغییر میده. وقتی مشتری دوباره صفحه رو رفرش کنه، قیمت متفاوتی میبینه.
سوم Phantom Read 👻
خب Phantom Read یعنی وقتی یه تراکنش یه مجموعه داده رو میخونه و در طول اجرای تراکنش، رکوردهای جدیدی به اون مجموعه اضافه یا حذف میشن. اینطوری وقتی دوباره همون پرسوجو رو انجام بدی، نتیجه متفاوتی میبینی.
مثال: فرض کن یه مدیر داره تعداد کارمندای یک بخش رو چک میکنه. در همون لحظه یکی دیگه یه کارمند جدید به همون بخش اضافه میکنه. حالا اگر مدیر دوباره تعداد کارمندها رو ببینه، یه کارمند جدید میاد توی لیست که دفعه قبل نبوده.
چهارم Deadlock 🔐
خب Deadlock وقتی اتفاق میافته که دو یا چند تراکنش همزمان منتظر همدیگه بمونن و نتونن کاری کنن. یعنی تراکنشها همدیگه رو قفل میکنن و نمیتونن ادامه بدن.
مثال: فرض کن تراکنش A میخواد رکورد ۱ رو قفل کنه و منتظر رکورد ۲ هم هست. همزمان تراکنش B رکورد ۲ رو قفل کرده و منتظر رکورد ۱ هست. اینجا تراکنشها همدیگه رو بلاک کردن و هیچکدوم نمیتونن کاری بکنن.
جمع بندی 🎯
اینا مشکلات رایجی هستن که توی مدیریت تراکنشها و همزمانی توی دیتابیسها رخ میده. با فهمیدن و شناسایی این مشکلات میتونید از بروز مشکلات جدی توی سیستمهای دیتابیسی جلوگیری کنید و عملکرد بهتری داشته باشید.
#db #dead_lock #programing
❤34
💎 چطوری مشکلات Dirty Read، Non-Repeatable Read، Phantom Read و Deadlock رو هندل کنیم؟ 💎
توی پست قبلی درباره چند تا مشکل مثل Dirty Read، Non-Repeatable Read، Phantom Read و Deadlock حرف زدیم. امروز میخوایم ببینیم چطوری میتونیم اینا رو توی برنامهمون هندل کنیم. اینا مشکلاتیه که میتونن عملکرد دیتابیس و اپلیکیشن رو خراب کنن، ولی با استفاده از تکنیکهای کنترل همزمانی و ایزولیشن میشه جلوی اینا رو گرفت.
1⃣ Dirty Read 💾
برای جلوگیری از Dirty Read، باید از سطح ایزولیشن مناسبی استفاده کنیم. یکی از بهترین سطوح ایزولیشن برای این کار Read Committed هست. این سطح تضمین میکنه که فقط دادههای commit شده قابل خوندن هستن.
مثال:
فرض کن توی دیتابیستون از سطح ایزولیشن Read Committed استفاده میکنی. اگه تراکنش A داره دادههایی رو آپدیت میکنه، تراکنش B تا وقتی که A کارش تموم نشده و دادهها رو commit نکرده، نمیتونه اون دادهها رو ببینه. پس از Dirty Read جلوگیری میشه.
2⃣ Non-Repeatable Read 🔄
برای جلوگیری از Non-Repeatable Read، باید سطح ایزولیشن رو به Repeatable Read تغییر بدیم. این سطح ایزولیشن تضمین میکنه که اگر یک بار دادهای رو توی تراکنش خوندیم، تا پایان تراکنش دیگه تغییر نمیکنه.
مثال:
فرض کن توی یه فروشگاه آنلاین، وقتی یه کاربر قیمت یه محصول رو چک میکنه، باید مطمئن بشی که اون قیمت تا پایان تراکنش تغییر نمیکنه. با استفاده از Repeatable Read، هر چی کاربر دید، همون میمونه.
3⃣ Phantom Read 👻
برای حل مشکل Phantom Read باید از سطح ایزولیشن Serializable استفاده کنیم. این سطح از ایزولیشن باعث میشه که نه تنها دادههای موجود، بلکه هر داده جدیدی هم تا پایان تراکنش دیده نشه.
مثال:
فرض کن یه مدیر داره گزارش تعداد کارمندای یه بخش رو چک میکنه. با سطح ایزولیشن Serializable، اگر کارمند جدیدی در طول تراکنش اضافه بشه، مدیر اون رو تا پایان تراکنش نمیبینه و از Phantom Read جلوگیری میشه.
4⃣ Deadlock 🔐
برای هندل کردن Deadlock، چند راه وجود داره:
1⃣ اجتناب از قفلهای طولانی:
تراکنشها رو سبک و سریع نگه دار تا قفلهای طولانی ایجاد نشن.
2⃣ ترتیب دسترسی یکسان:
مطمئن شو که تراکنشها به منابع به یه ترتیب دسترسی پیدا میکنن. یعنی اگر A و B هر دو به رکوردهای ۱ و ۲ نیاز دارن، هر دو اول رکورد ۱ رو قفل کنن و بعد برن سراغ رکورد ۲.
3⃣ زمانبندی دوباره تراکنشها:
میتونی از دیتابیس بخوای که اگه Deadlock تشخیص داد، یکی از تراکنشها رو ریست کنه و دوباره اجرا کنه.
مثال:
فرض کن توی اپلیکیشن مالیات دو تراکنش همزمان دارن از منابع یکسان استفاده میکنن. یکی از راههای جلوگیری از Deadlock اینه که مطمئن بشی تراکنشها به یه ترتیب مشخص به منابع دسترسی دارن، مثلاً اول رکورد ۱ رو قفل میگیرن و بعد رکورد ۲.
جمعبندی 🎯
با استفاده از سطوح ایزولیشن و یه سری تکنیکهای مدیریت تراکنش، میتونیم مشکلاتی مثل Dirty Read، Non-Repeatable Read، Phantom Read و Deadlock رو توی دیتابیسهامون حل کنیم. اگر این نکات رو توی اپلیکیشنهاتون رعایت کنید، کارتون خیلی راحتتر و پایدارتر میشه.
امید وارم مفید بوده باشه :)
@ninja_learn_ir
توی پست قبلی درباره چند تا مشکل مثل Dirty Read، Non-Repeatable Read، Phantom Read و Deadlock حرف زدیم. امروز میخوایم ببینیم چطوری میتونیم اینا رو توی برنامهمون هندل کنیم. اینا مشکلاتیه که میتونن عملکرد دیتابیس و اپلیکیشن رو خراب کنن، ولی با استفاده از تکنیکهای کنترل همزمانی و ایزولیشن میشه جلوی اینا رو گرفت.
1⃣ Dirty Read 💾
برای جلوگیری از Dirty Read، باید از سطح ایزولیشن مناسبی استفاده کنیم. یکی از بهترین سطوح ایزولیشن برای این کار Read Committed هست. این سطح تضمین میکنه که فقط دادههای commit شده قابل خوندن هستن.
مثال:
فرض کن توی دیتابیستون از سطح ایزولیشن Read Committed استفاده میکنی. اگه تراکنش A داره دادههایی رو آپدیت میکنه، تراکنش B تا وقتی که A کارش تموم نشده و دادهها رو commit نکرده، نمیتونه اون دادهها رو ببینه. پس از Dirty Read جلوگیری میشه.
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
2⃣ Non-Repeatable Read 🔄
برای جلوگیری از Non-Repeatable Read، باید سطح ایزولیشن رو به Repeatable Read تغییر بدیم. این سطح ایزولیشن تضمین میکنه که اگر یک بار دادهای رو توی تراکنش خوندیم، تا پایان تراکنش دیگه تغییر نمیکنه.
مثال:
فرض کن توی یه فروشگاه آنلاین، وقتی یه کاربر قیمت یه محصول رو چک میکنه، باید مطمئن بشی که اون قیمت تا پایان تراکنش تغییر نمیکنه. با استفاده از Repeatable Read، هر چی کاربر دید، همون میمونه.
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
3⃣ Phantom Read 👻
برای حل مشکل Phantom Read باید از سطح ایزولیشن Serializable استفاده کنیم. این سطح از ایزولیشن باعث میشه که نه تنها دادههای موجود، بلکه هر داده جدیدی هم تا پایان تراکنش دیده نشه.
مثال:
فرض کن یه مدیر داره گزارش تعداد کارمندای یه بخش رو چک میکنه. با سطح ایزولیشن Serializable، اگر کارمند جدیدی در طول تراکنش اضافه بشه، مدیر اون رو تا پایان تراکنش نمیبینه و از Phantom Read جلوگیری میشه.
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
4⃣ Deadlock 🔐
برای هندل کردن Deadlock، چند راه وجود داره:
1⃣ اجتناب از قفلهای طولانی:
تراکنشها رو سبک و سریع نگه دار تا قفلهای طولانی ایجاد نشن.
2⃣ ترتیب دسترسی یکسان:
مطمئن شو که تراکنشها به منابع به یه ترتیب دسترسی پیدا میکنن. یعنی اگر A و B هر دو به رکوردهای ۱ و ۲ نیاز دارن، هر دو اول رکورد ۱ رو قفل کنن و بعد برن سراغ رکورد ۲.
3⃣ زمانبندی دوباره تراکنشها:
میتونی از دیتابیس بخوای که اگه Deadlock تشخیص داد، یکی از تراکنشها رو ریست کنه و دوباره اجرا کنه.
مثال:
فرض کن توی اپلیکیشن مالیات دو تراکنش همزمان دارن از منابع یکسان استفاده میکنن. یکی از راههای جلوگیری از Deadlock اینه که مطمئن بشی تراکنشها به یه ترتیب مشخص به منابع دسترسی دارن، مثلاً اول رکورد ۱ رو قفل میگیرن و بعد رکورد ۲.
BEGIN TRANSACTION;
-- Lock resources in the same order
جمعبندی 🎯
با استفاده از سطوح ایزولیشن و یه سری تکنیکهای مدیریت تراکنش، میتونیم مشکلاتی مثل Dirty Read، Non-Repeatable Read، Phantom Read و Deadlock رو توی دیتابیسهامون حل کنیم. اگر این نکات رو توی اپلیکیشنهاتون رعایت کنید، کارتون خیلی راحتتر و پایدارتر میشه.
#sql #dead_lock #programing
🔥12❤4👍1
ـ Dependency Injection چیه؟ 🤔
امروز میخوایم بررسی کنیم Dependency Injection یا همون تزریق وابستگی چیه
خب Dependency injection یه مفهومی توی برنامهنویسی شیگراست که به سادهترین شکل میشه گفت برای جداسازی وابستگیها بین کلاسها استفاده میشه. یعنی چی؟ یعنی به جای اینکه هر کلاس خودش مستقلاً وابستگیهای مورد نیازش رو بسازه، این وابستگیها از بیرون بهش تزریق میشه. این کار باعث میشه کد ما تمیزتر، انعطافپذیرتر و قابل تستتر بشه.
چرا مهمه؟ 🤨
فرض کن یه کلاس داری که برای کارکردش نیاز به یه سری سرویسهای دیگه داره. مثلاً کلاسی که مسئول لاگین کاربره، نیاز به سرویس دیتابیس داره. حالا اگه این سرویس رو خود کلاس بسازه، دیگه وابستگی محکمی بین این دو تا وجود داره. یعنی هر وقت بخوای دیتابیس رو عوض کنی، باید بری توی این کلاس دست ببری. اما اگه از Dependency Injection استفاده کنی، میتونی هر وقت خواستی به این کلاس هر دیتابیسی که دوست داری تزریق کنی، بدون اینکه نیاز باشه توی کدش تغییری بدی.
یه مثال ساده 🤓
فرض کن کلاس زیر رو داری که برای ارسال پیام نیاز به یه سرویس پیامرسان داره:
اینجا کلاس
حالا با استفاده از Dependency Injection اینجوری مینویسیمش:
تو این حالت،
مزایای Dependency Injection 📈
1⃣ قابلیت تست بیشتر: چون وابستگیها از بیرون تزریق میشن، میتونی راحتتر mock کنی و تست بنویسی.
2⃣ انعطافپذیری بیشتر: راحت میتونی وابستگیهای مختلف رو جایگزین کنی بدون اینکه توی کلاس تغییر بدی.
3⃣ کاهش coupling: وابستگی بین کلاسها کمتر میشه و این باعث میشه کدات مستقلتر باشن.
جمعبندی 🎯
فهمیدیم که Dependency Injection بهت کمک میکنه که کدهای تمیزتری داشته باشی که راحتتر تست و اپدیت میشن. خیلی وقتا که بخوای یه اپلیکیشن بزرگ و مقیاسپذیر بنویسی، این الگو میتونه کارتو خیلی راحتتر کنه. پس دفعه بعد که داشتی کد میزدی و حس کردی یه کلاس داره زیادی به کلاسهای دیگه وابسته میشه، به فکر استفاده از این روش باش 😉
ممنون میشم با ریکشن و شیر از ما حمایت کنید :) ❤️🔥
@ninja_learn_ir
امروز میخوایم بررسی کنیم Dependency Injection یا همون تزریق وابستگی چیه
خب Dependency injection یه مفهومی توی برنامهنویسی شیگراست که به سادهترین شکل میشه گفت برای جداسازی وابستگیها بین کلاسها استفاده میشه. یعنی چی؟ یعنی به جای اینکه هر کلاس خودش مستقلاً وابستگیهای مورد نیازش رو بسازه، این وابستگیها از بیرون بهش تزریق میشه. این کار باعث میشه کد ما تمیزتر، انعطافپذیرتر و قابل تستتر بشه.
چرا مهمه؟ 🤨
فرض کن یه کلاس داری که برای کارکردش نیاز به یه سری سرویسهای دیگه داره. مثلاً کلاسی که مسئول لاگین کاربره، نیاز به سرویس دیتابیس داره. حالا اگه این سرویس رو خود کلاس بسازه، دیگه وابستگی محکمی بین این دو تا وجود داره. یعنی هر وقت بخوای دیتابیس رو عوض کنی، باید بری توی این کلاس دست ببری. اما اگه از Dependency Injection استفاده کنی، میتونی هر وقت خواستی به این کلاس هر دیتابیسی که دوست داری تزریق کنی، بدون اینکه نیاز باشه توی کدش تغییری بدی.
یه مثال ساده 🤓
فرض کن کلاس زیر رو داری که برای ارسال پیام نیاز به یه سرویس پیامرسان داره:
class NotificationService:
def __init__(self):
self.sender = EmailSender()
def send(self, message):
self.sender.send(message)
اینجا کلاس
NotificationService
مستقیم وابسته به EmailSender
هست، یعنی اگه بعداً بخوای از یه روش دیگه برای ارسال پیام (مثلاً SMSSender
) استفاده کنی، باید بری کد این کلاس رو تغییر بدی. این باعث میشه کدات به هم گره بخورن و انعطافپذیری کم بشه.حالا با استفاده از Dependency Injection اینجوری مینویسیمش:
class NotificationService:
def __init__(self, sender):
self.sender = sender
def send(self, message):
self.sender.send(message)
تو این حالت،
sender
(که میتونه EmailSender
، SMSSender
یا هر چیز دیگهای باشه) از بیرون به NotificationService
تزریق میشه. حالا اگه بخوای نوع ارسال پیام رو تغییر بدی، فقط کافیه یه شیء جدید بهش تزریق کنی:email_sender = EmailSender()
sms_sender = SMSSender()
notification = NotificationService(email_sender) # استفاده از ایمیل
notification.send("Hello via Email!")
notification_sms = NotificationService(sms_sender) # استفاده از SMS
notification_sms.send("Hello via SMS!")
مزایای Dependency Injection 📈
1⃣ قابلیت تست بیشتر: چون وابستگیها از بیرون تزریق میشن، میتونی راحتتر mock کنی و تست بنویسی.
2⃣ انعطافپذیری بیشتر: راحت میتونی وابستگیهای مختلف رو جایگزین کنی بدون اینکه توی کلاس تغییر بدی.
3⃣ کاهش coupling: وابستگی بین کلاسها کمتر میشه و این باعث میشه کدات مستقلتر باشن.
جمعبندی 🎯
فهمیدیم که Dependency Injection بهت کمک میکنه که کدهای تمیزتری داشته باشی که راحتتر تست و اپدیت میشن. خیلی وقتا که بخوای یه اپلیکیشن بزرگ و مقیاسپذیر بنویسی، این الگو میتونه کارتو خیلی راحتتر کنه. پس دفعه بعد که داشتی کد میزدی و حس کردی یه کلاس داره زیادی به کلاسهای دیگه وابسته میشه، به فکر استفاده از این روش باش 😉
#programing #backend
❤23
معرفی Pydantic 🧩
ـPydantic یه کتابخونه خفنه برای پایتون که بهت اجازه میده راحت و دقیق دادههات رو اعتبارسنجی (validation) و تایپ کنی. اگه توی پروژههای بزرگ کار میکنی، Pydantic خیلی کمکت میکنه چون بهت کمک میکنه دادهها رو تمیز و بینقص نگه داری.
چرا Pydantic؟ 🔍
فرض کن میخوای دادههای کاربر رو توی یه اپلیکیشن بگیری، اما مطمئن نیستی که دادهها دقیقا همونی هستن که میخوای. ممکنه کاربر یه مقدار اشتباه وارد کنه، یه فیلد رو جا بندازه، یا نوع داده رو اشتباه بزنه. با Pydantic، میتونی مطمئن باشی که همه چیز درست وارد شده و اگه چیزی اشتباه بود، خیلی راحت یه ارور میگیری و جلوش رو میگیری.
چطور کار میکنه؟ 🔨
ـPydantic با استفاده از مدلها کار میکنه. مدلها همون کلاسهای پایتون هستن که به کمکشون میتونی ساختار داده رو تعریف کنی. بیاید با یه مثال شروع کنیم:
اینجا یه مدل به نام
بررسی Validation در Pydantic 🛠️
ـPydantic بهت این امکان رو میده که خیلی راحت دادهها رو اعتبارسنجی کنی. مثلا اگه بخوای مطمئن بشی که
اینجا
جمعبندی 🎯
فهمیدیم Pydantic یه ابزار قوی برای مدیریت و اعتبارسنجی دادههاست که بهویژه تو پروژههای بزرگ و APIها خیلی کمک میکنه. میتونی مدلهای پیچیده بسازی، دادهها رو اعتبارسنجی کنی، و با استفاده از تایپهای قوی پایتون، کد تمیزتر و قابل خوانا تر بکنی.
امید وارم مفید بوده باشه :)
@ninja_learn_ir
ـPydantic یه کتابخونه خفنه برای پایتون که بهت اجازه میده راحت و دقیق دادههات رو اعتبارسنجی (validation) و تایپ کنی. اگه توی پروژههای بزرگ کار میکنی، Pydantic خیلی کمکت میکنه چون بهت کمک میکنه دادهها رو تمیز و بینقص نگه داری.
چرا Pydantic؟ 🔍
فرض کن میخوای دادههای کاربر رو توی یه اپلیکیشن بگیری، اما مطمئن نیستی که دادهها دقیقا همونی هستن که میخوای. ممکنه کاربر یه مقدار اشتباه وارد کنه، یه فیلد رو جا بندازه، یا نوع داده رو اشتباه بزنه. با Pydantic، میتونی مطمئن باشی که همه چیز درست وارد شده و اگه چیزی اشتباه بود، خیلی راحت یه ارور میگیری و جلوش رو میگیری.
چطور کار میکنه؟ 🔨
ـPydantic با استفاده از مدلها کار میکنه. مدلها همون کلاسهای پایتون هستن که به کمکشون میتونی ساختار داده رو تعریف کنی. بیاید با یه مثال شروع کنیم:
from pydantic import BaseModel
class User(BaseModel):
id: int
name: str
email: str
age: int = 18 # مقدار پیشفرض
user_data = {
"id": 1,
"name": "Ali",
"email": "ali@example.com"
}
user = User(**user_data)
print(user)
اینجا یه مدل به نام
User
تعریف کردیم که شامل id
، name
، email
و age
هست. اگه فیلدی رو اشتباه بدیم یا از نوعی غیر از نوع مشخصشده استفاده کنیم، Pydantic خطا میده.بررسی Validation در Pydantic 🛠️
ـPydantic بهت این امکان رو میده که خیلی راحت دادهها رو اعتبارسنجی کنی. مثلا اگه بخوای مطمئن بشی که
email
به فرمت درستی وارد شده، Pydantic خودش اینو هندل میکنه و نیازی نیست دستی بررسی کنی. بیاین یه مثال دیگه رو ببینیم:from pydantic import BaseModel, EmailStr, PositiveInt
class User(BaseModel):
id: PositiveInt
name: str
email: EmailStr
age: int = 18
try:
user = User(id=-1, name="Ali", email="ali@bad-email", age=22)
except ValueError as e:
print("خطا:", e)
اینجا
PositiveInt و EmailStr رو استفاده کردیم که به طور خودکار id باید مثبت باشه و email هم باید فرمت درستی داشته باشه. این یعنی خیلی راحت میتونی دادهها رو کنترل کنی و از ورود دادههای اشتباه جلوگیری کنی.
مدلهای تو در تو (Nested Models) 🧬
اگه دادههات پیچیدهترن و شامل چند مدل میشن، میتونی مدلهای تو در تو بسازی. مثلا:
from typing import List
from pydantic import BaseModel
class Address(BaseModel):
street: str
city: str
class User(BaseModel):
id: int
name: str
addresses: List[Address]
user_data = {
"id": 1,
"name": "Ali",
"addresses": [
{"street": "خیابون اول", "city": "تهران"},
{"street": "خیابون دوم", "city": "مشهد"}
]
}
user = User(**user_data)
print(user)
جمعبندی 🎯
فهمیدیم Pydantic یه ابزار قوی برای مدیریت و اعتبارسنجی دادههاست که بهویژه تو پروژههای بزرگ و APIها خیلی کمک میکنه. میتونی مدلهای پیچیده بسازی، دادهها رو اعتبارسنجی کنی، و با استفاده از تایپهای قوی پایتون، کد تمیزتر و قابل خوانا تر بکنی.
#python #pydantic #programing
👍8❤3👌2🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
#programing #algorithm
این ویدیو الگوریتمهای مختلف Sorting رو به تصویر میکشه و نشون میده چطور هر کدوم عملیات مرتبسازی رو انجام میدن.
واقعا دیدنیه 🌚
🔆 CHANNEL | GROUP
👍5❤4👏2👌1
💎 ـPartial Functions در پایتون 💎
تا حالا شده یه تابع بنویسی که پر از آرگومان باشه و همیشه بخوای یه سری از اون آرگومانها مقدار ثابتی داشته باشن؟ مثلا فرض کن توی یه پروژه مدام داری درخواست HTTP میفرستی و همیشه متد رو روی
🔎 ـPartial Functions چی هست؟
خیلی ساده، Partial Function بهت اجازه میده یه نسخه سفارشیشده از تابع اصلی بسازی که یه سری از آرگومانهاش از قبل مقداردهی شده. این کار با
🧠 چرا Partial Functions مفیدن؟
✅ سادگی و تمیزی کد: به
✅ کاهش خطا:
✅ ایجاد نسخههای شخصیسازیشده از توابع:
🛠️ چطور Partial Functions بسازیم؟
اینجا
🚀 کاربردهای Partial Functions
1⃣ سادهسازی توابع با آرگومانهای زیاد
وقتی توابع زیادی با پارامترهای تکراری داری، Partial Functions میتونه کمکت کنه:
2⃣ انعطاف بیشتر با توابع دیگر
ـPartial Functions میتونه با توابعی مثل
3⃣ بهبود خوانایی کد در سیستمهای بزرگ
وقتی پروژههات پیچیده میشن، Partial Functions بهت کمک میکنن توابعی بسازی که واضحترن:
⚖️ مقایسه با دیگر روشها
ـPartial Functions یه جایگزین سبکتر برای تعریف کلاسهای خاص یا توابع جدیده. اما وقتی منطق خیلی پیچیدهای داری یا نیاز به شرطهای مختلف هست، بهتره به جای Partial Functions از کلاسها یا Wrapper Functions استفاده کنی.
✍️ جمعبندی
فهمیدیم Partial Functions ابزاری ساده اما قدرتمند در پایتون هستن که میتونن کدهای تکراری رو حذف کنن و انعطاف بالایی بهت بدن.
امید وارم مفید بوده باشه :)
تا حالا شده یه تابع بنویسی که پر از آرگومان باشه و همیشه بخوای یه سری از اون آرگومانها مقدار ثابتی داشته باشن؟ مثلا فرض کن توی یه پروژه مدام داری درخواست HTTP میفرستی و همیشه متد رو روی
POST
میذاری. به جای تکرار این مقدار ثابت، Partial Functions به کمکت میان و کدتو خیلی حرفهایتر میکنن. 🔎 ـPartial Functions چی هست؟
خیلی ساده، Partial Function بهت اجازه میده یه نسخه سفارشیشده از تابع اصلی بسازی که یه سری از آرگومانهاش از قبل مقداردهی شده. این کار با
functools.partial
انجام میشه. 🧠 چرا Partial Functions مفیدن؟
✅ سادگی و تمیزی کد: به
جای تکرار، یه بار آرگومان ثابت رو تعریف میکنی.
✅ کاهش خطا:
آرگومانهای ثابت توی یه جای مشخص مقداردهی میشن.
✅ ایجاد نسخههای شخصیسازیشده از توابع:
بدون نیاز به تعریف تابع جدید.
🛠️ چطور Partial Functions بسازیم؟
from functools import partial
def multiply(x, y):
return x * y
double = partial(multiply, y=2)
print(double(5)) # خروجی: 10
اینجا
double
نسخهای از multiply
شده که مقدار y
همیشه 2
هست. فقط لازمه x
رو بهش بدی. 🚀 کاربردهای Partial Functions
1⃣ سادهسازی توابع با آرگومانهای زیاد
وقتی توابع زیادی با پارامترهای تکراری داری، Partial Functions میتونه کمکت کنه:
def send_request(method, url, headers, data):
# ارسال درخواست
pass
post_request = partial(send_request, method='POST')
post_request(url='/api/data', headers={}, data={})
2⃣ انعطاف بیشتر با توابع دیگر
ـPartial Functions میتونه با توابعی مثل
map
و filter
خیلی خوب کار کنه: from functools import partial
def power(base, exponent):
return base ** exponent
square = partial(power, exponent=2)
numbers = [1, 2, 3, 4]
squared_numbers = list(map(square, numbers))
print(squared_numbers) # خروجی: [1, 4, 9, 16]
3⃣ بهبود خوانایی کد در سیستمهای بزرگ
وقتی پروژههات پیچیده میشن، Partial Functions بهت کمک میکنن توابعی بسازی که واضحترن:
from functools import partial
def logger(log_level, message):
print(f"[{log_level}] {message}")
info_logger = partial(logger, log_level='INFO')
info_logger("This is an info message") # خروجی: [INFO] This is an info message
⚖️ مقایسه با دیگر روشها
ـPartial Functions یه جایگزین سبکتر برای تعریف کلاسهای خاص یا توابع جدیده. اما وقتی منطق خیلی پیچیدهای داری یا نیاز به شرطهای مختلف هست، بهتره به جای Partial Functions از کلاسها یا Wrapper Functions استفاده کنی.
✍️ جمعبندی
فهمیدیم Partial Functions ابزاری ساده اما قدرتمند در پایتون هستن که میتونن کدهای تکراری رو حذف کنن و انعطاف بالایی بهت بدن.
#python #programing
🔆 CHANNEL | GROUP
👌13❤2🔥2