Extensión¶
La dirección principal para extender asyncio es escribir clases event loop personalizadas. Asyncio tiene ayudantes que podrían usarse para simplificar esta tarea.
Nota
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 Event loop methods for the full list.
Implementing them all from scratch is a tedious job.
Un bucle puede obtener la implementación de muchos métodos comunes de forma gratuita al heredar de asyncio.BaseEventLoop.
A su vez, el sucesor debería implementar un montón de métodos privados declarados pero no implementados en asyncio.BaseEventLoop.
Por ejemplo, loop.create_connection() comprueba los argumentos, resuelve las direcciones DNS y llama a loop._make_socket_transport() que debería implementar la clase heredada. El método _make_socket_transport() no está documentado y se considera como una API internal.
Constructores privados Future y Task¶
asyncio.Future y asyncio.Task nunca deben crearse directamente; en su lugar, utilice las fábricas loop.create_future() y loop.create_task() o asyncio.create_task() correspondientes.
Sin embargo, event loops de terceros puede reuse incorporar futuras implementaciones y tareas con el fin de obtener un código complejo y altamente optimizado de forma gratuita.
Para ello se listan los siguientes constructores private:
- Future.__init__(*, loop=None)¶
Cree una instancia futura integrada.
loop es una instancia de bucle de eventos opcional.
- Task.__init__(coro, *, loop=None, name=None, context=None)¶
Cree una instancia de tarea integrada.
loop es una instancia de bucle de eventos opcional. El resto de argumentos se describen en la descripción de
loop.create_task().Distinto en la versión 3.11: Se agrega el argumento context.
Soporte de por vida de tareas¶
La implementación de una tarea de terceros debe llamar a las siguientes funciones para mantener una tarea visible para asyncio.all_tasks() y asyncio.current_task():
- asyncio._register_task(task)¶
Registre un nuevo task como administrado por asyncio.
Llame a la función desde un constructor de tareas.
- asyncio._unregister_task(task)¶
Anule el registro de un task de las estructuras internas de asyncio.
La función debe llamarse cuando una tarea está a punto de finalizar.
- asyncio._enter_task(loop, task)¶
Cambie la tarea actual al argumento task.
Llame a la función justo antes de ejecutar una parte del coroutine incrustado (
coroutine.send()ocoroutine.throw()).
- asyncio._leave_task(loop, task)¶
Vuelva a cambiar la tarea actual de task a
None.Llame a la función justo después de la ejecución de
coroutine.send()ocoroutine.throw().