Políticas

Advertencia

Policies are deprecated and will be removed in Python 3.16. Users are encouraged to use the asyncio.run() function or the asyncio.Runner with loop_factory to use the desired loop implementation.

Una política de bucle de eventos es un objeto global que se utiliza para obtener y establecer el bucle de eventos actual o para crear nuevos bucles de eventos. La política preestablecida puede ser reemplazada con alternativas built-in para usar diferentes implementaciones de bucles de eventos, o sustituida por una política personalizada la cual puede anular estos comportamientos.

El objeto de política obtiene y establece un bucle de eventos separado por contexto. Por defecto, esto se realiza por hilo, aunque las políticas personalizadas pueden definir el contexto de una forma diferente.

Las políticas de bucle de eventos personalizadas pueden controlar el comportamiento de get_event_loop(), set_event_loop(), y new_event_loop().

Los objetos de política deberían implementar las APIs definidas en la clase abstracta base AbstractEventLoopPolicy.

Obteniendo y configurando la política

Las siguientes funciones pueden ser usadas para obtener y configurar la política de los procesos actuales:

asyncio.get_event_loop_policy()

Retorna la política actual en todo el proceso.

Obsoleto desde la versión 3.14: The get_event_loop_policy() function is deprecated and will be removed in Python 3.16.

asyncio.set_event_loop_policy(policy)

Establece la política actual en todo el proceso a policy.

Si policy está configurado a None, la política por defecto se reestablece.

Obsoleto desde la versión 3.14: The set_event_loop_policy() function is deprecated and will be removed in Python 3.16.

Objetos de política

La clase base de política de bucle de eventos abstractos se define de la siguiente manera:

class asyncio.AbstractEventLoopPolicy

Una clase base abstracta para políticas asyncio.

get_event_loop()

Retorna el bucle de eventos para el contexto actual.

Retorna un objeto bucle de eventos implementando la interfaz AbstractEventLoop.

Este método nunca debería retornar None.

Distinto en la versión 3.6.

set_event_loop(loop)

Establece el bucle de eventos para el contexto a loop.

new_event_loop()

Crea y retorna un nuevo objeto de bucle de eventos.

Este método nunca debería retornar None.

Obsoleto desde la versión 3.14: The AbstractEventLoopPolicy class is deprecated and will be removed in Python 3.16.

asyncio se envía con las siguientes políticas integradas:

class asyncio.DefaultEventLoopPolicy

La política por defecto asyncio. Usa SelectorEventLoop en Unix y ProactorEventLoop en Windows.

No hay necesidad de instalar la política por defecto manualmente. asyncio está configurado para usar la política por defecto automáticamente.

Distinto en la versión 3.8: En Windows, ProactorEventLoop ahora se usa por defecto.

Distinto en la versión 3.14: The get_event_loop() method of the default asyncio policy now raises a RuntimeError if there is no set event loop.

Obsoleto desde la versión 3.14: The DefaultEventLoopPolicy class is deprecated and will be removed in Python 3.16.

class asyncio.WindowsSelectorEventLoopPolicy

Una política de bucle de eventos alternativa que usa la implementación de bucle de eventos SelectorEventLoop.

Availability: Windows.

Obsoleto desde la versión 3.14: The WindowsSelectorEventLoopPolicy class is deprecated and will be removed in Python 3.16.

class asyncio.WindowsProactorEventLoopPolicy

Una política de bucle de eventos alternativa que usa la implementación de bucle de eventos ProactorEventLoop.

Availability: Windows.

Obsoleto desde la versión 3.14: The WindowsProactorEventLoopPolicy class is deprecated and will be removed in Python 3.16.

Personalizar Políticas

Para implementar una nueva política de bucle de eventos, se recomienda heredar DefaultEventLoopPolicy y sobreescribir los métodos para los cuales se desea una conducta personalizada, por ejemplo:

class MyEventLoopPolicy(asyncio.DefaultEventLoopPolicy):

    def get_event_loop(self):
        """Get the event loop.

        This may be None or an instance of EventLoop.
        """
        loop = super().get_event_loop()
        # Do something with loop ...
        return loop

asyncio.set_event_loop_policy(MyEventLoopPolicy())