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