اگر تا حالا گذرتون به دنیای برنامه‌نویسی غیرهمزمان (Asynchronous) در پایتون افتاده باشه، حتماً می‌دونید که این دنیا چقدر می‌تونه جذاب و در عین حال پر از دردسر باشه. از یک طرف asyncio رو داریم که کتابخونه استاندارد و پیش‌فرض خود پایتونه، و از طرف دیگه trio با اون طراحی تمیز، ساختاریافته و دل‌فریبش بهمون چشمک می‌زنه.

حالا تصور کنید می‌خواید یه پکیج یا کتابخونه اوپن‌سورس بنویسید. سوال اینجاست: کدمون رو برای کدوم یکی از این دو تا بهینه کنیم؟ اگه کاربر ما از اون یکی استفاده کنه چی؟ اینجاست که AnyIO  وارد داستان می‌شه!

AnyIO چی هست؟

خیلی ساده بخوام بگم، AnyIO یک لایه واسط (Abstraction Layer) برای برنامه‌نویسی اسینکرون در پایتونه.

هدف AnyIO یک چیزه: کدت رو فقط یک بار بنویس، ولی اجازه بده روی هر بک‌اندی (چه asyncio و چه trio) بدون کوچک‌ترین باگی اجرا بشه.

در واقع AnyIO خودش یه موتور اجرای اسینکرون نیست، بلکه مثل یه مترجم کاربلد عمل می‌کنه که کدهای شما رو می‌گیره و به زبونِ بک‌اندی که در حال اجراست ترجمه می‌کنه.

چرا AnyIO انقدر خفنه و باید جدی بگیریمش؟

بیاید ببینیم چرا فریمورک‌های بزرگی مثل FastAPI و Starlette به AnyIO مهاجرت کردن یا ازش قدرت می‌گیرن:

  • پایان جنگ بک‌اندها (سازگاری مطلق): دیگه نیازی نیست نگران این باشید که اپلیکیشن نهایی کاربرتون داره با چی ران می‌شه. شما با سینتکس AnyIO کد می‌زنید و خیال‌تون راحته که همه‌جا جواب می‌ده.

  • مدیریت تسک‌ها به سبک مدرن (Task Groups): یکی از بزرگترین مشکلات asyncio مدیریت تسک‌های پراکنده‌ست. AnyIO با الهام از Trio، مفهومی به اسم "گروه تسک‌ها" یا Task Groups رو آورده. اگه یکی از تسک‌ها تو گروه کرش کنه، بقیه هم با نظم و ترتیب کنسل می‌شن تا منابع سیستم هدر نره.

  • تایم‌اوت‌های بی‌دردسر (Cancel Scopes): هندل کردن تایم‌اوت تو کدهای اسینکرون همیشه یه کابوس بوده. AnyIO با ویژگی Cancel Scopes بهتون اجازه می‌ده دور هر تیکه از کدت که خواستی یه مرز زمانی بکشی و بگی "اگه تو این مدت تموم نشدی، بی‌خیالت می‌شم!".

  • یک API برای همه چیز: از کار با فایل‌ها (File I/O) گرفته تا شبکه، سوکت‌ها و قفل‌ها (Locks)، همگی تو یه رابط کاربری یکپارچه و تمیز جمع شدن.

یه نگاه به کد بندازیم 

برای اینکه ببینید چقدر کار باهاش راحته، به این مثال کوچیک نگاه کنید:

import anyio

async def main():
    print("سلام از دنیای AnyIO!")
    # به جای asyncio.sleep یا trio.sleep فقط از anyio استفاده می‌کنیم
    await anyio.sleep(1)
    print("یک ثانیه گذشت و ما هنوز اینجاییم!")

# اجرای کد با بک‌اند asyncio
anyio.run(main, backend='asyncio')

# یا اجرای دقیقاً همون کد با بک‌اند trio!
# anyio.run(main, backend='trio')

می‌بینید چقدر تمیزه؟ ما فقط ماژول AnyIO رو صدا زدیم و موقع اجرا بهش گفتیم از کدوم موتور استفاده کنه. کدهای درون تابع main نیازی به هیچ تغییری نداشتن!

جمع بندی

اگر دارید روی یه پروژه اسینکرون بزرگ کار می‌کنید، یا قصد دارید یه کتابخونه پایتونی بسازید که قراره توسط بقیه دولوپرها استفاده بشه، شک نکنید که AnyIO بهترین دوست شماست. این ابزار نه‌تنها کدهاتون رو تمیزتر و خواناتر می‌کنه، بلکه شما رو از شر باگ‌های عجیب و غریبِ مربوط به سازگاری فریمورک‌ها نجات میده.