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