گسترش

جهت اصلی گسترش asyncio، نوشتن کلاس‌های سفارشی حلقه رویداد است. Asyncio ابزارهای کمکی دارد که می‌توان از آن‌ها برای ساده‌سازی این کار استفاده کرد.

توجه

اشخاص ثالث باید با احتیاط از کد asyncio موجود دوباره استفاده کنند؛ یک نسخه جدید پایتون مجاز است سازگاری عقب‌گرد را در بخش داخلی API نقض کند.

نوشتن یک حلقه رویداد سفارشی

asyncio.AbstractEventLoop تعداد بسیار زیادی متد را اعلام می‌کند. پیاده‌سازی همه‌ی آن‌ها از ابتدا کار خسته‌کننده‌ای است.

یک حلقه می‌تواند با ارث‌بری از asyncio.BaseEventLoop، پیاده‌سازی بسیاری از متدهای رایج را به‌رایگان به دست آورد.

به‌نوبه خود، جانشین باید تعدادی متد خصوصی را که در asyncio.BaseEventLoop اعلام‌شده‌اند اما پیاده‌سازی‌نشده‌اند، پیاده‌سازی کند.

برای مثال، loop.create_connection() آرگومان‌ها را بررسی می‌کند، آدرس‌های DNS را حل می‌کند و loop._make_socket_transport() را فراخوانی می‌کند که باید توسط کلاس مشتق‌شده پیاده‌سازی شود. متد _make_socket_transport() مستند نشده است و به‌عنوان یک API داخلی در نظر گرفته می‌شود.

سازنده‌های خصوصی Future و Task

asyncio.Future و asyncio.Task را هرگز نباید به‌صورت مستقیم ایجاد کرد؛ لطفاً به‌جای آن‌ها از کارخانه‌های متناظر loop.create_future() و loop.create_task() یا asyncio.create_task() استفاده کنید.

با این حال، حلقه‌های رویداد شخص ثالث ممکن است برای به‌دست آوردن کدی پیچیده و بسیار بهینه‌شده به‌صورت رایگان، از پیاده‌سازی‌های توکار future و task دوباره استفاده کنند.

برای این منظور، سازنده‌های خصوصی زیر فهرست شده‌اند:

Future.__init__(*, loop=None)

یک نمونه‌ی فیوچر توکار ایجاد کنید.

loop نمونه‌ای اختیاری از حلقه رویداد است.

Task.__init__(coro, *, loop=None, name=None, context=None)

یک نمونه از وظیفه توکار ایجاد کنید.

loop یک نمونه اختیاری از حلقه رویداد است. سایر آرگومان‌ها در توضیحات loop.create_task() شرح داده شده‌اند.

تغییر یافته در نسخه‌ی 3.11: آرگومان context اضافه شد.

پشتیبانی از طول عمر Task

یک پیاده‌سازی وظیفه شخص ثالث باید توابع زیر را فراخوانی کند تا یک وظیفه برای asyncio.all_tasks() و asyncio.current_task() قابل مشاهده باقی بماند:

asyncio._register_task(task)

یک وظیفه جدید را به‌عنوان مدیریت‌شده توسط asyncio ثبت کنید.

تابع را از یک سازنده‌ی وظیفه فراخوانی کنید.

asyncio._unregister_task(task)

ثبت یک task را از ساختارهای داخلی asyncio حذف کنید.

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

asyncio._enter_task(loop, task)

وظیفه جاری را به آرگومان task تغییر دهید.

تابع را درست پیش از اجرای بخشی از هم‌روال تعبیه‌شده فراخوانی کنید (coroutine.send() یا coroutine.throw()).

asyncio._leave_task(loop, task)

وظیفه‌ی جاری را از task به None بازمی‌گرداند.

تابع را درست پس از اجرای coroutine.send() یا coroutine.throw() فراخوانی کنید.