گسترش¶
جهت اصلی گسترش 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()فراخوانی کنید.