شرح آسیب پذیری race condition
بذارین اول یه مقدمه ساده بگم تا قشنگ متوجه بشین Race Condition چه بلایی سر سیستمهامون میاره! 🔍
Race Condition یه مشکل خیلی خطرناکه که تو برنامهنویسی باهاش سر و کار داریم. حالا چرا بهش میگن Race (مسابقه)؟ چون دقیقاً مثل دو تا ماشین که سر رسیدن به خط پایان با هم مسابقه میذارن، دو تا درخواست همزمان میخوان به یه منبع برسن! 🏎
یه مثال باحال براتون بزنم:
فرض کنید تو یه فروشگاه اینترنتی فقط یه گوشی آیفون آخرین مدل مونده. همون لحظه دو نفر میخوان بخرنش. هر دو نفر همزمان دکمه خرید رو میزنن. سیستم چک میکنه و میبینه گوشی موجوده و به هر دو نفر اجازه خرید میده! اینجوری میشه که یه گوشی به دو نفر فروخته میشه! 📱
حالا یه مثال دیگه از دنیای واقعی:
تو بانکها خیلی این اتفاق میفته. طرف میره از عابر بانک پول برداره، همون لحظه خانمش هم از یه عابر دیگه برداشت میکنه. اگه سیستم درست طراحی نشده باشه، ممکنه بیشتر از موجودی حساب، پول برداشت بشه! 💸
بذارید یه کد براتون بزنم که قشنگ درک کنید مشکل از کجاست:
# این کد خرابه! اصلا به دردمون نمیخوره
mojudi = 500_000 # فرض کنید 500 هزار تومن داریم
def bardasht_pool(meghdar):
global mojudi
if mojudi >= meghdar:
# یه تاخیر کوچولو
time.sleep(0.1)
mojudi = mojudi - meghdar
print(f"برداشت {meghdar} تومن انجام شد!")
return True
return False
# حالا دو نفر همزمان میخوان 400 تومن بردارن
thread1 = Thread(target=bardasht_pool, args=(400_000,))
thread2 = Thread(target=bardasht_pool, args=(400_000,))
خب حالا چجوری درستش کنیم؟ باید از یه چیزی به اسم قفل (Lock) استفاده کنیم. مثل وقتی که میری دستشویی و درو قفل میکنی که کسی نیاد تو! 🔐
# اینو ببین، درست شده!
from threading import Lock
mojudi = 500_000
ghofl = Lock()
def bardasht_pool_safe(meghdar):
global mojudi
with ghofl:
if mojudi >= meghdar:
time.sleep(0.1)
mojudi = mojudi - meghdar
print(f"برداشت {meghdar} تومن انجام شد!")
return True
return False
حالا چند تا نکته طلایی که باید یادتون باشه:
1. هر جا دیدین چند نفر دارن همزمان به یه چیز دسترسی پیدا میکنن، یه چراغ قرمز تو ذهنتون روشن شه! 🚨
2. Race Condition فقط مخصوص بانکها نیست. تو هر سیستمی ممکنه پیش بیاد:
- سیستم رزرو بلیط هواپیما ✈️
- فروشگاههای آنلاین موقع حراجی 🛒
- سیستم ثبتنام دانشگاه 🎓
- حتی موقع لایک کردن پستهای اینستا! ❤️
راههای جلوگیری از Race Condition:
1. قفل گذاشتن رو منابع مشترک
2. استفاده از صف (Queue) برای ترتیب دادن به درخواستها
3. استفاده از سِمافور (مثل چراغ راهنمایی عمل میکنه)
4. Atomic Operations (عملیاتهایی که نمیشه وسطشون پرید)
خلاصه اینکه هر وقت دارین سیستمی طراحی میکنین که چند نفر قراره همزمان ازش استفاده کنن، حتماً به Race Condition فکر کنین و راه حلش رو هم پیاده کنین، وگرنه یه روز میبینین سیستمتون داره عجیب غریب رفتار میکنه و نمیدونین چرا! 🤯
دوستان اگر توضیحات گنگ یا از نظر اکادمیکی مشکلی داشت حتما اطلاع بدید
©️ Masih|2022