معرفی chameleon-rs؛ بازنویسی Chameleon با Rust برای Python مدرن

چرا مهم است

اگر تو از Chameleon استفاده می‌کنی، این پروژه راهی برای امتحان‌کردن rendering سریع‌تر و پشتیبانی async بدون بازنویسی template‌هاست. البته کاهش ۲۰ درصدی زمان پاسخ، نتیجهٔ برنامهٔ نویسنده است و تضمینی برای برنامهٔ تو نیست.

قبل از خواندن، این‌ها را بدان۴ مفهوم
Global Interpreter Lock (GIL)

قفل داخلی در Python که اجرای هم‌زمان Python bytecode توسط چند thread را محدود می‌کند. حالت free-threaded امکان اجرا بدون این قفل را فراهم می‌کند.

بیشتر درباره این مفهوم

event loop

سازوکاری برای مدیریت اجرای کارهای async؛ وقتی کاری منتظر داده است، می‌تواند اجرای کارهای دیگر را پیش ببرد.

بیشتر درباره این مفهوم

partial

یک template کوچک که داخل template دیگری render می‌شود و می‌تواند داده‌های مخصوص خودش را داشته باشد؛ مثلاً برای نمایش کارت یا ردیف جدول.

بیشتر درباره این مفهوم

Shadow Mode

روشی برای آزمایش پیاده‌سازی جدید با ورودی واقعی، در کنار پیاده‌سازی فعلی؛ خروجی جدید مقایسه می‌شود اما مستقیماً به کاربر ارائه نمی‌شود.

بیشتر درباره این مفهوم

Michael Kennedy پروژهٔ chameleon-rs را معرفی کرده است؛ پیاده‌سازی تقریباً کامل زبان template در Chameleon با Rust، با هدف حفظ سازگاری، افزایش سرعت و پشتیبانی از نیازهای برنامه‌های وب مدرن Python. به گفتهٔ او، template‌ها و کدهای موجود بدون تغییر اجرا می‌شوند و خروجی یکسانی در سطح byte تولید می‌کنند.

انگیزهٔ این پروژه، از جمله، پشتیبانی رسمی از free-threaded Python در Python 3.14 و ادامهٔ توسعهٔ آن در 3.15 بوده است. Kennedy می‌گوید repository مربوط به Chameleon تنها تا Python 3.13 را پشتیبانی‌شده نشان می‌دهد و build آن نیز ناموفق است. در مقابل، chameleon-rs برای rendering به‌شکل thread-safe و بدون Global Interpreter Lock (GIL) طراحی و آزمایش شده و dependency در runtime ندارد.

در زمینهٔ عملکرد، Kennedy گزارش می‌دهد که جایگزینی Chameleon با chameleon-rs در برنامهٔ وب خودش، میانهٔ زمان پاسخ را در سراسر سایت حدود ۲۰ درصد کاهش داده است. این عدد مربوط به کل برنامه، شامل احراز هویت، کار با database، logging و بخش تجارت الکترونیکی است؛ نه صرفاً سرعت rendering یک template. او همچنین می‌گوید عملیات داخلی template در Rust و بدون Python bytecode انجام می‌شود؛ Python فقط هنگام مراجعه به کد برنامه، مانند فراخوانی method یا helper، وارد عمل می‌شود.

قابلیت‌های جدید شامل partial داخلی، تبدیل Markdown به HTML و async rendering است. متد render_async() هنگام انتظار برای داده، event loop را آزاد می‌گذارد. اتصال داخلی به Flask/Quart، FastAPI، Starlette، Robyn و Litestar نیز فراهم شده است. پشتیبانی Markdown اختیاری است و converter داخلی آن با comrak در Rust کار می‌کند؛ بنابراین نصب package جداگانه برای Markdown لازم نیست.

برای مهاجرت، دو مسیر معرفی شده است: اجرای chameleon_rs.compat.install() در ابتدای برنامه و پیش از هر import از Chameleon، یا تغییر import‌ها به chameleon_rs. برای ارزیابی پیش از مهاجرت نیز Shadow Mode وجود دارد: نمونه‌ای از ترافیک واقعی با هر دو پیاده‌سازی render می‌شود و تفاوت خروجی‌ها گزارش می‌شود، درحالی‌که Chameleon همچنان پاسخ کاربران را ارائه می‌کند. این روش امکان بررسی سازگاری را بدون تغییر خروجی قابل‌مشاهده برای کاربران فراهم می‌کند.

نکته کلیدی

قبل از مهاجرت، با Shadow Mode خروجی دو پیاده‌سازی را روی نمونه‌ای از ترافیک واقعی مقایسه کن. بعد زمان پاسخ برنامهٔ خودت را اندازه بگیر؛ نتیجهٔ کل برنامه را با سرعت rendering یک template یکی ندان.

خواندن مقاله اصلی (در زبانه‌ی جدید باز می‌شود)
برچسب‌ها (۴)