چگونه یک میلیون درخواست در ثانیه را با پایتون پاسخ دهیم ؟
اگر در حوزه تحلیل داده کار کرده باشید،میدانید که پایتون را معمولاً برای ساخت مدلهای پیشگویی کننده و امور مربوط به پاکسازی و پردازش اولیه داده استفاده میکنیم و برای پاسخگویی به کاربران و به عبارت دیگر به عنوان Backend
کمتر از این زبان استفاده می کنیم. دلیل آن هم کارآیی پایین آن نسبت به رقبای دیگر بازار مانند Rust
یا Node.js
است.
حدود یکسال پیش مقاله ای دیدم با عنوان پردازش یک میلیون درخواست در ثانیه با پایتون که در آن یک میکروفریمورک جدید با نام Japronto
معرفی شده بود که با هدف ایجاد یک بستر سریع برای پاسخگویی به درخواستهای همزمان با حجم بالا و با زبان سی و به صورت بهینه از اول نوشته شده و استفاده از کتابخانه asyncio
در آن، امکان برنامه نویسی همزمان و ناهمزمان را به صورت خودکار فراهم کرده است. استفاده از امکانات موازیسازی HTTP
که با نام HTTP pipelining هم شناخته می شود و در زیر با شکل توضیح داده شده است، از جمله دیگر بهینه سازیهایی است که در این میکروفریمورک صورت گرفته است.
نموداری که در صفحه اصلی این میکروفریمورک به مقایسه میزان زمان پاسخ آن با سایر زبانها و فریمورکها پرداخته است از قرار زیر است :
البته در خود سایت Japronto
هم آمده است که برخی از این زبانها و فریمورکها با تنظیمات پیشرفته اگر پیکربندی شوند، میزان اختلاف سرعت پاسخگویی کمتر میشود اما هنوز به Japronto
نخواهند رسید.
نمونه کد سادهای که با این میکروفریمورک نوشته شده است را میتوانید در بالا مشاهده کنید.
در هر صورت اگر در کارهای تخصصی روزانه خود با پایتون سروکار دارید و میخواهید خدماتی را بر اساس تحلیلها و مدلهایی که ساختهاید، به کاربران ارائه دهید، میتوانید با Japronto
یک سرویس سریع با قابلیت پاسخگویی بسیار بالا ایجاد کنید. هر چند استفاده از میکروفریمورکها در پروژههای بزرگ توصیه نمیشود.
پینوشت : با تشکر از جناب دانشور عزیز که نکاتی را در بخش نظرات این مقاله مطرح کردند، جهت بررسی دقیقتر سرعت پاسخگویی و مقایسه بین فریمورکهای موجود در بازار، به این آدرس مراجعه کنید.
با سلام
کمی عجیب هست این فریمورک بر اساس لایبری libuv نوشته شده که هسته اصلی node.js هست من خودم با libuv مستقیم کار کردم becchmarkهایی هم که گرفتم ازش از Go با fastHTTP بالاتر بوده اما نه در این حد در ضمن وقتی در پیج گیتهاب japronto نگاه کردم برای تست Go رو به یک Core از CPU محدود کرده و کاش با چند هسته هم تست میکرد، نتیجه تست من بر روی دو سیستم با شبکه ۱Gbps به این شکل بود (پاسخگویی تعداد درخواست در ثانیه برای ۵۰۰۰ درخواست همزمان):
libuv 1 Core: 128,428
libuv 4 Core: 134,087
Go fastHTTP 1 Core: 60,844
Go fastHTTP 4 Core: 82,029
Node.js 1 Core: 10,144
Node.js 4 Core: 45,005
جالبه الان توی سایت techempower.com نگاه کردم نتیجه برعکس ادعایی هست که japronto داره و بنچمارک fastHTTP Go رو ۹۹.۸٪ زده و برای japronto زده ۳۸.۶٪ در نتیجه مشک آن است که خود ببوید
در ضمن HTTP pipelining به دلیل مشکلات ذاتی که ایجاد میکرده توسط اکثر Web Browserهای غیرفعال شده.