# 平台支持

`asyncio` 模块被设计为可移植的,但由于平台的底层架构和功能，一些平台存在细微的差异和限制。

## 所有平台

- `loop.add_reader()` 和 `loop.add_writer()` 不能用来监视文件I/O。

## Windows

源代码: Lib/asyncio/proactor_events.py, Lib/asyncio/windows_events.py, Lib/asyncio/windows_utils.py

在 3.8 版本发生变更: 在 Windows 上，`ProactorEventLoop` 现在是默认的事件循环。

Windows上的所有事件循环都不支持以下方法:

- 不支持 `loop.create_unix_connection()` 和 `loop.create_unix_server()`。 `socket.AF_UNIX` 套接字族是 Unix 专属的。

- 不支持 `loop.add_signal_handler()` 和 `loop.remove_signal_handler()` 。

`SelectorEventLoop` 有下列限制:

- `SelectSelector` 只被用于等待套接字事件：它支持套接字且最多支持512个套接字。

- `loop.add_reader()` 和 `loop.add_writer()` 只接受套接字处理回调函数(如管道、文件描述符等都不支持)。

- 因为不支持管道，所以 `loop.connect_read_pipe()` 和 `loop.connect_write_pipe()` 方法没有实现。

- 不支持 Subprocesses ，也就是 `loop.subprocess_exec()` 和 `loop.subprocess_shell()` 方法没有实现。

`ProactorEventLoop` 有下列限制:

- 不支持 `loop.add_reader()` 和 `loop.add_writer()` 方法。

通常 Windows 上单调时钟的分辨率约为 15.6 毫秒。 最佳分辨率是 0.5 毫秒。 分辨率依赖于具体的硬件 (HPET 的可用性) 和 Windows 的设置。

### Windows的子进程支持

在 Windows 上，默认的事件循环 `ProactorEventLoop` 支持子进程，而 `SelectorEventLoop` 则不支持。

也不支持 `policy.set_child_watcher()` 函数，`ProactorEventLoop` 有不同的机制来监视子进程。

## macOS

完整支持流行的macOS版本。

macOS <= 10.8

在 macOS 10.6, 10.7 和 10.8 上，默认的事件循环使用 `selectors.KqueueSelector`，在这些版本上它并不支持字符设备。 可以手工配置 `SelectorEventLoop` 来使用 `SelectSelector` 或 `PollSelector` 以在这些较老版本的 macOS 上支持字符设备。 例如:

    import asyncio
    import selectors

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