# 平臺支援

`asyncio` module（模組）被設計為可攜的 (portable)，但由於平臺的底層架構和功能不同，在一些平臺上存在細微的差異和限制。

## 所有平台

- `loop.add_reader()` 和 `loop.add_writer()` 不能用來監視檔案 I/O。

## Windows

原始碼：Lib/asyncio/proactor_events.py、source:`Lib/asyncio/windows_events.py、source:`Lib/asyncio/windows_utils.py

在 3.8 版的變更: 在 Windows 上，現在 `ProactorEventLoop` 是預設的事件迴圈。

Windows 上的所有事件迴圈都不支援以下 method（方法）：

- 不支援 `loop.create_unix_connection()` 和 `loop.create_unix_server()`。`socket.AF_UNIX` socket 系列常數僅限於 Unix 上使用。

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

`SelectorEventLoop` 有以下限制：

- `SelectSelector` 只被用於等待 socket 事件：它支援 socket 且最多支援 512 個 socket。

- `loop.add_reader()` 和 `loop.add_writer()` 只接受 socket 處理函式（例如不支援 pipe 檔案描述器 (pipe file descriptor)）。

- 因為不支援 pipe，所以 `loop.connect_read_pipe()` 和 `loop.connect_write_pipe()` method 沒有被實作出來。

- 不支援子行程 (subprocess)，也就是說 `loop.subprocess_exec()` 和 `loop.subprocess_shell()` method 沒有被實作出來。

`ProactorEventLoop` 有以下限制：

- 不支援 `loop.add_reader()` 和 `loop.add_writer()` method。

Windows 上單調時鐘 (monotonic clock) 的解析度大約為 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`，在這些版本上它並不支援字元裝置 (character device)。可以手工設置 `SelectorEventLoop` 來使用 `SelectSelector` 或 `PollSelector` 以在這些舊版 macOS 上支援字元裝置。例如：

    import asyncio
    import selectors

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