Alireza-Fa
پکیج پایتونی gevent
چرا gevent اصلاً متولد شد؟
قبل از اینکه کلمات کلیدی async و await وارد پایتون شوند، برنامهنویسها برای مدیریت هزاران درخواست همزمان (مشکل C10k) یک دردسر بزرگ داشتند.
استفاده از Threadهای سیستمعامل برای پایتون بسیار سنگین بود و حافظه زیادی مصرف میکرد. فریمورکهایی مثل Twisted هم بودند که بر اساس Callback کار میکردند، اما خواندن و دیباگ کردن کدهای آنها شبیه یک کابوس (Callback Hell) بود.
اینجا بود که gevent با یک ایده درخشان وارد شد: کد را به شکل ساده و همگام (Sync) بنویس، اما ما آن را در پسزمینه به صورت ناهمگام (Async) و با سرعت نور اجرا میکنیم! gevent این کار را با استفاده از گرینلتها (Greenlets) که میکروتردهای بسیار سبکی در سطح C هستند، انجام داد.
الان با وجود asyncio، پرونده gevent بسته شده است؟
با اینکه asyncio استاندارد مدرن و آینده پایتون است، اما gevent هنوز یک برگ برنده بزرگ دارد: پروژههای قدیمی (Legacy).
اگر شما یک پروژه بزرگ جنگو (Django) یا فلسک (Flask) دارید که با کدهای معمولی نوشته شده، نمیتوانید یکشبه دهها هزار خط کد را به async/await تبدیل کنید. gevent با تکنیک Monkey Patching به شما اجازه میدهد بدون تغییر دادن حتی یک خط از منطق اصلی برنامهتان، عملکرد I/O سرور را چند برابر کنید.
مثال در سلری:
فرض کنید باید ۱۰۰ ایمیل بفرستید یا از ۱۰۰ سایت دیتا استخراج کنید (کارهای I/O Bound).اگر در Celery از حالت پیشفرض (Prefork/Processes) استفاده کنید و فقط ۲ عدد Worker داشته باشید، در هر لحظه فقط ۲ تسک انجام میشود. بقیه تسکها باید در صف منتظر بمانند تا این دو تمام شوند. این یعنی اتلاف زمان!
اما اگر Worker را با gevent اجرا کنید:
celery -A my_project worker -P gevent -c 100
همان ۲ پروسس حالا میتوانند هر ۱۰۰ تسک را همزمان مدیریت کنند! وقتی تسک اول منتظر جواب سرور ایمیل است، gevent سریعاً سراغ تسک دوم میرود. با کمترین مصرف رم و CPU، سرعت اجرای تسکهای شبکهای شما دهها برابر میشود.
#gevent
@Syntax_fa
15 · 1.7K ·