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
Los terceros deben reutilizar el código asyncio existente con precaución, una nueva versión de Python es gratuita para romper la compatibilidad con versiones anteriores en la parte internal de la API.
Escribir un bucle de eventos personalizado¶
asyncio.AbstractEventLoop
declara muchos métodos. Implementarlos todos desde cero es un trabajo tedioso.
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()
.