ابزار و کتابخانه ها

چگونه یک میلیون درخواست در ثانیه را با پایتون پاسخ دهیم ؟

اگر در حوزه تحلیل داده کار کرده باشید،‌می‌دانید که پایتون را معمولاً برای ساخت مدل‌های پیش‌گویی کننده و امور مربوط به پاکسازی و پردازش اولیه داده استفاده می‌کنیم و برای پاسخگویی به کاربران و به عبارت دیگر به عنوان Backend کمتر از این زبان استفاده می کنیم. دلیل آن هم کارآیی پایین آن نسبت به رقبای دیگر بازار مانند Rust یا Node.js است.

حدود یکسال پیش مقاله ای دیدم با عنوان پردازش یک میلیون درخواست در ثانیه با پایتون که در آن یک میکروفریمورک جدید با نام Japronto معرفی شده بود که با هدف ایجاد یک بستر سریع برای پاسخگویی به درخواست‌های همزمان با حجم بالا و با زبان سی و به صورت بهینه از اول نوشته شده و استفاده از کتابخانه asyncio در آن، امکان برنامه نویسی همزمان و ناهمزمان را به صورت خودکار فراهم کرده است. استفاده از امکانات موازی‌سازی HTTP که با نام HTTP pipelining هم شناخته می شود و در زیر با شکل توضیح داده شده است،  از جمله دیگر بهینه سازی‌هایی است که در این میکروفریمورک صورت گرفته است.

نموداری که در صفحه اصلی این میکروفریمورک به مقایسه میزان زمان پاسخ آن با سایر زبان‌ها و فریمورک‌ها پرداخته است از قرار زیر است :

البته در خود سایت Japronto هم آمده است که برخی از این زبان‌ها و فریمورک‌ها با تنظیمات پیشرفته اگر پیکربندی شوند، میزان اختلاف سرعت پاسخگویی کمتر می‌شود اما هنوز به Japronto نخواهند رسید.

Python

نمونه کد ساده‌ای که با این میکروفریمورک نوشته شده است را می‌توانید در بالا مشاهده کنید.

در هر صورت اگر در کارهای تخصصی روزانه خود با پایتون سروکار دارید و می‌خواهید خدماتی را بر اساس تحلیل‌ها و مدلهایی که ساخته‌اید، به کاربران ارائه دهید، می‌توانید با Japronto یک سرویس سریع با قابلیت پاسخگویی بسیار بالا ایجاد کنید. هر چند استفاده از میکروفریمورک‌ها در پروژه‌های بزرگ توصیه نمی‌شود.

پی‌نوشت : با تشکر از جناب دانشور عزیز که نکاتی را در بخش نظرات این مقاله مطرح کردند، جهت بررسی دقیق‌تر سرعت پاسخگویی و مقایسه بین فریمورک‌های موجود در بازار، به این آدرس مراجعه کنید.

مجتبی بنائی

دانشجوی دکترای نرم‌افزار دانشگاه تهران (yun.ir/smbanaie)، مدرس دانشگاه و فعال در حوزه توسعه نرم‌افزار و مهندسی داده که تمرکز کاری خود را در چند سال اخیر بر روی مطالعه و تحقیق در حوزه کلان‌داده و زیرساخت‌های پردازش داده و تولید محتوای تخصصی و کاربردی به زبان فارسی و انتشار آنها در سایت مهندسی داده گذاشته است. مدیریت پروژه‌های نرم‌افزاری و طراحی سامانه‌های مقیاس‌پذیر اطلاعاتی از دیگر فعالیتهای صورت گرفته ایشان در چند سال گذشته است.

۳ دیدگاه

  1. با سلام
    کمی عجیب هست این فریمورک بر اساس لایبری 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

  2. جالبه الان توی سایت techempower.com نگاه کردم نتیجه برعکس ادعایی هست که japronto داره و بنچمارک fastHTTP Go رو ۹۹.۸٪ زده و برای japronto زده ۳۸.۶٪ در نتیجه مشک آن است که خود ببوید

  3. در ضمن  HTTP pipelining به دلیل مشکلات ذاتی که ایجاد میکرده توسط اکثر Web Browserهای غیرفعال شده.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.

دکمه بازگشت به بالا