اگر فکر کردهاید WSGI و ASGI فقط چند تا حروف اختصاری دهان پرکن هستند که توی مصاحبه های کاری برای ترساندن جونیور ها استفاده میشوند، باید بگویم سخت در اشتباهید. اینها دقیقاً همان فونداسیونی هستند که تعیین میکنند وبسایت شما زیر بار ۱۰۰۰ نفر کاربر همزمان، مثل بنز کار کند یا مثل یک پیکان خسته در سربالایی، ریپ بزند و در نهایت خطای "Internal Server Error" بدهد.
برنامهنویسی که نمیداند زیر شنل فریمورکش (چه جنگو باشد، چه FastAPI) چه میگذرد، مثل رانندهای است که نمیداند ماشینش دیفرانسیل جلو است یا عقب؛ راه میرود، اما نمیداند چرا یکجا بکسوات میکند!
عصر WSGI
سالها پیش (حدود ۲۰۰۳)، وقتی دنیای وب هنوز انقدر وحشی نشده بود، استاندارد WSGI (Web Server Gateway Interface) متولد شد. فلسفهاش ساده بود: یک پل استاندارد بین وبسرور (مثل Nginx) و کد پایتون شما.
مشکل کجاست؟ WSGI کاملاً Synchronous یا همگام است. یعنی چه؟ یعنی مثل گارسونی است که سفارش شما را میگیرد، میرود دم در آشپزخانه میایستد تا غذا آماده شود، آن را تحویل شما میدهد و تازه بعد از آن میرود سراغ مشتری بعدی!
-
اگر دیتابیس شما ۳ ثانیه طول بکشد تا جواب بدهد، آن "Worker" پایتون عملاً قفل میشود.
-
توی دنیای WSGI، مفاهیمی مثل چت آنلاین (WebSockets) یا نوتیفیکیشن زنده، یک کابوس به تمام معنا بودند.
-
سرور برای پاسخگویی به کاربران بیشتر، مجبور است مدام گارسونهای (Processes/Threads) بیشتری استخدام کند که یعنی مصرف رم و سیپییو به شدت بالا میرود.
ظهور پارادایم Async: پایتون یاد میگیرد همزمان چند کار را انجام دهد
وقتی سر و کلهی asyncio در پایتون پیدا شد، همه فهمیدند که استانداردهای قدیمی دیگر جوابگو نیستند. ما به چیزی نیاز داشتیم که وقتی کد منتظر دیتابیس است، بیکار ننشیند و برود به درخواستهای دیگر برسد. اینجاست که ASGI وارد بازی شد.
لایه ASGI: گارسونی که روی اسکیتبرد سوار است!
ASGI (Asynchronous Server Gateway Interface) جانشین خلف WSGI است. این استاندارد نیامد که قبلی را دور بریزد، آمد تا آن را کامل کند.
-
تفاوت اصلی: در ASGI، گارسون سفارش را میگیرد، آن را به آشپزخانه میسپارد و بلافاصله برمیگردد تا سفارش ۵ نفر دیگر را هم بگیرد. هر وقت هر غذا آماده شد، آن را به صاحبش میرساند.
-
فقط HTTP نیست: برخلاف WSGI که فقط زبان HTTP را میفهمید، ASGI با WebSockets و HTTP/2 هم رفیق فابریک است. یعنی برای ساختن یک صرافی آنلاین یا یک بازی تحت وب، شما «مجبورید» که در دنیای ASGI زندگی کنید.
تفاوت در عمل: کدها حرف میزنند
بیایید تفاوت را در دنیای واقعی ببینیم. فرض کنید یک عملیات ۵ ثانیهای (مثل ارسال ایمیل) داریم:
در دنیای WSGI (مثل Flask):
@app.route("/send-email")
def send_email():
time.sleep(5) # کل سرور قفل میشود!
return "ایمیل ارسال شد"
در این ۵ ثانیه، هیچ کاربر دیگری نمیتواند حتی صفحهی اصلی سایت را ببیند!
در دنیای ASGI (مثل FastAPI):
@app.get("/send-email")
async def send_email():
await asyncio.sleep(5) # سرور آزاد است و به بقیه میرسد
return "ایمیل ارسال شد"
اینجا سرور هوشمندانه میگوید: «من ۵ ثانیه وقت دارم، پس بگذار در این فاصله به ۱۰۰ تا درخواست دیگر جواب بدهم.»
مقایسه تئوریک در یک نگاه
| ویژگی | WSGI (قدیمی و مطمئن) | ASGI (مدرن و سریع) |
| مدل ذهنی | یک کار در هر لحظه (Blocking) | چند کار همزمان (Non-blocking) |
| پشتیبانی از چت/ویدیو | در حد فاجعه | بومی و عالی |
| فریمورکهای معروف | Flask, Django (سابق) | FastAPI, Starlette, Django Channels |
| بهرهوری منابع | پایین (مصرف بالای RAM) | بسیار بالا |
چرا این معماری نجاتبخش است؟
برنامهنویسی که فرق این دو را نمیداند، مثل کسی است که میخواهد با قاشق چایخوری چاه فاضلاب بکند؛ شاید موفق شود، اما خیلی طول میکشد و بعید است به نتیجهی تمیزی برسد!
استفاده از ASGI به شما این قدرت را میدهد که: ۱. با سختافزار ضعیفتر، به کاربران بیشتری پاسخ بدهید. ۲. قابلیتهای مدرن مثل Real-time پدیتها را به راحتی پیاده کنید. ۳. کدی بنویسید که در سال ۲۰۲۵، خندهدار و قدیمی به نظر نرسد.
نتیجهگیری
تکامل از WSGI به ASGI، صرفاً یک تغییر فنی نبود؛ بلکه یک تغییر پارادایم در نحوه تفکر ما نسبت به وب بود. ما از دنیای توالیهای خطی به دنیای رویدادهای همزمان کوچ کردیم.
فراموش نکنید: ابزارها به شما سرعت میدهند، اما این درک عمیق شما از لایههای زیرین است که از شما یک مهندس ارشد میسازد، نه یک کدنویس معمولی که فقط بلد است کتابخانهها را کپی-پیست کند.
نظرات کاربران (0)