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())
