17db96d56Sopenharmony_ci.. currentmodule:: asyncio
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci=========
57db96d56Sopenharmony_ciExtending
67db96d56Sopenharmony_ci=========
77db96d56Sopenharmony_ci
87db96d56Sopenharmony_ciThe main direction for :mod:`asyncio` extending is writing custom *event loop*
97db96d56Sopenharmony_ciclasses. Asyncio has helpers that could be used to simplify this task.
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ci.. note::
127db96d56Sopenharmony_ci
137db96d56Sopenharmony_ci   Third-parties should reuse existing asyncio code with caution,
147db96d56Sopenharmony_ci   a new Python version is free to break backward compatibility
157db96d56Sopenharmony_ci   in *internal* part of API.
167db96d56Sopenharmony_ci
177db96d56Sopenharmony_ci
187db96d56Sopenharmony_ciWriting a Custom Event Loop
197db96d56Sopenharmony_ci===========================
207db96d56Sopenharmony_ci
217db96d56Sopenharmony_ci:class:`asyncio.AbstractEventLoop` declares very many methods.  Implementing all them
227db96d56Sopenharmony_cifrom scratch is a tedious job.
237db96d56Sopenharmony_ci
247db96d56Sopenharmony_ciA loop can get many common methods implementation for free by inheriting from
257db96d56Sopenharmony_ci:class:`asyncio.BaseEventLoop`.
267db96d56Sopenharmony_ci
277db96d56Sopenharmony_ciIn turn, the successor should implement a bunch of *private* methods declared but not
287db96d56Sopenharmony_ciimplemented in :class:`asyncio.BaseEventLoop`.
297db96d56Sopenharmony_ci
307db96d56Sopenharmony_ciFor example, ``loop.create_connection()`` checks arguments, resolves DNS addresses, and
317db96d56Sopenharmony_cicalls ``loop._make_socket_transport()`` that should be implemented by inherited class.
327db96d56Sopenharmony_ciThe ``_make_socket_transport()`` method is not documented and is considered as an
337db96d56Sopenharmony_ci*internal* API.
347db96d56Sopenharmony_ci
357db96d56Sopenharmony_ci
367db96d56Sopenharmony_ci
377db96d56Sopenharmony_ciFuture and Task private constructors
387db96d56Sopenharmony_ci====================================
397db96d56Sopenharmony_ci
407db96d56Sopenharmony_ci:class:`asyncio.Future` and :class:`asyncio.Task` should be never created directly,
417db96d56Sopenharmony_ciplease use corresponding :meth:`loop.create_future` and :meth:`loop.create_task`,
427db96d56Sopenharmony_cior :func:`asyncio.create_task` factories instead.
437db96d56Sopenharmony_ci
447db96d56Sopenharmony_ciHowever, third-party *event loops* may *reuse* built-in future and task implementations
457db96d56Sopenharmony_cifor the sake of getting a complex and highly optimized code for free.
467db96d56Sopenharmony_ci
477db96d56Sopenharmony_ciFor this purpose the following, *private* constructors are listed:
487db96d56Sopenharmony_ci
497db96d56Sopenharmony_ci.. method:: Future.__init__(*, loop=None)
507db96d56Sopenharmony_ci
517db96d56Sopenharmony_ci   Create a built-in future instance.
527db96d56Sopenharmony_ci
537db96d56Sopenharmony_ci   *loop* is an optional event loop instance.
547db96d56Sopenharmony_ci
557db96d56Sopenharmony_ci.. method:: Task.__init__(coro, *, loop=None, name=None, context=None)
567db96d56Sopenharmony_ci
577db96d56Sopenharmony_ci   Create a built-in task instance.
587db96d56Sopenharmony_ci
597db96d56Sopenharmony_ci   *loop* is an optional event loop instance. The rest of arguments are described in
607db96d56Sopenharmony_ci   :meth:`loop.create_task` description.
617db96d56Sopenharmony_ci
627db96d56Sopenharmony_ci   .. versionchanged:: 3.11
637db96d56Sopenharmony_ci
647db96d56Sopenharmony_ci      *context* argument is added.
657db96d56Sopenharmony_ci
667db96d56Sopenharmony_ci
677db96d56Sopenharmony_ci
687db96d56Sopenharmony_ciTask lifetime support
697db96d56Sopenharmony_ci=====================
707db96d56Sopenharmony_ci
717db96d56Sopenharmony_ciA third party task implementation should call the following functions to keep a task
727db96d56Sopenharmony_civisible by :func:`asyncio.get_tasks` and :func:`asyncio.current_task`:
737db96d56Sopenharmony_ci
747db96d56Sopenharmony_ci.. function:: _register_task(task)
757db96d56Sopenharmony_ci
767db96d56Sopenharmony_ci   Register a new *task* as managed by *asyncio*.
777db96d56Sopenharmony_ci
787db96d56Sopenharmony_ci   Call the function from a task constructor.
797db96d56Sopenharmony_ci
807db96d56Sopenharmony_ci.. function:: _unregister_task(task)
817db96d56Sopenharmony_ci
827db96d56Sopenharmony_ci   Unregister a *task* from *asyncio* internal structures.
837db96d56Sopenharmony_ci
847db96d56Sopenharmony_ci   The function should be called when a task is about to finish.
857db96d56Sopenharmony_ci
867db96d56Sopenharmony_ci.. function:: _enter_task(loop, task)
877db96d56Sopenharmony_ci
887db96d56Sopenharmony_ci   Switch the current task to the *task* argument.
897db96d56Sopenharmony_ci
907db96d56Sopenharmony_ci   Call the function just before executing a portion of embedded *coroutine*
917db96d56Sopenharmony_ci   (:meth:`coroutine.send` or :meth:`coroutine.throw`).
927db96d56Sopenharmony_ci
937db96d56Sopenharmony_ci.. function:: _leave_task(loop, task)
947db96d56Sopenharmony_ci
957db96d56Sopenharmony_ci   Switch the current task back from *task* to ``None``.
967db96d56Sopenharmony_ci
977db96d56Sopenharmony_ci   Call the function just after :meth:`coroutine.send` or :meth:`coroutine.throw`
987db96d56Sopenharmony_ci   execution.
99