Soporte de plataforma
*********************

El módulo "asyncio" está diseñado para ser portátil, pero algunas
plataformas tienen diferencias y limitaciones sutiles debido a la
arquitectura y las capacidades subyacentes de las plataformas.


Todas las plataformas
=====================

* "loop.add_reader()" y "loop.add_writer()" no se pueden utilizar para
  supervisar la E/S del archivo.


Windows
=======

**Código fuente:** Lib/asyncio/proactor_events.py,
Lib/asyncio/windows_events.py, Lib/asyncio/windows_utils.py

======================================================================

Distinto en la versión 3.8: En Windows, "ProactorEventLoop" es ahora
el bucle de eventos predeterminado.

Todos los bucles de eventos en Windows no admiten los métodos
siguientes:

* "loop.create_unix_connection()" y "loop.create_unix_server()" no son
  compatibles. La familia de sockets "socket.AF_UNIX" es específica de
  Unix.

* "loop.add_signal_handler()" y "loop.remove_signal_handler()" no son
  compatibles.

"SelectorEventLoop" tiene las siguientes limitaciones:

* "SelectSelector" se utiliza para esperar los eventos de los sockets:
  soporta los sockets y está limitado a 512 sockets.

* "loop.add_reader()" y "loop.add_writer()" sólo aceptan manejadores
  de sockets (por ejemplo, los descriptores de archivos de tuberías no
  están soportados).

* Las tuberías no están soportadas, por lo que los métodos
  "loop.connect_read_pipe()" y "loop.connect_write_pipe()" no están
  implementados.

* Subprocesos no están soportados, es decir, los métodos
  "loop.subprocess_exec()" y "loop.subprocess_shell()" no están
  implementados.

"ProactorEventLoop" tiene las siguientes limitaciones:

* Los métodos "loop.add_reader()" y "loop.add_writer()" no están
  soportados.

La resolución del reloj monótono de Windows suele ser de unos 15,6
milisegundos. La mejor resolución es de 0,5 milisegundos. La
resolución depende del hardware (disponibilidad de HPET) y de la
configuración de Windows.


Soporte de sub-procesos en Windows
----------------------------------

En Windows, el bucle de eventos por defecto "ProactorEventLoop"
soporta subprocesos, mientras que "SelectorEventLoop" no lo hace.

La función "policy.set_child_watcher()" tampoco está soportada, ya que
"ProactorEventLoop" tiene un mecanismo diferente para vigilar los
procesos hijos.


macOS
=====

Las versiones modernas de MacOS son totalmente compatibles.

-[ macOS <= 10.8 ]-

En macOS 10.6, 10.7 y 10.8, el bucle de eventos por defecto utiliza
"selectors.KqueueSelector", que no soporta dispositivos de caracteres
en estas versiones. El "SelectorEventLoop" puede ser configurado
manualmente para usar "SelectSelector" o "PollSelector" para soportar
dispositivos de caracteres en estas versiones antiguas de macOS.
Ejemplo:

   import asyncio
   import selectors

   selector = selectors.SelectSelector()
   loop = asyncio.SelectorEventLoop(selector)
   asyncio.set_event_loop(loop)
