گسترش¶
جهت اصلی گسترش asyncio، نوشتن کلاسهای سفارشی حلقه رویداد است. Asyncio ابزارهای کمکی دارد که میتوان از آنها برای سادهسازی این کار استفاده کرد.
نکته
Third-parties should reuse existing asyncio code with caution, a new Python version is free to break backward compatibility in the internal part of the API.
Writing a custom event loop¶
asyncio.AbstractEventLoop declares very many methods.
See متدهای حلقه رویداد for the full list.
Implementing them all from scratch is a tedious job.
یک حلقه میتواند با ارثبری از 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()فراخوانی کنید.