# プラットフォームでのサポート

`asyncio` モジュールは可搬的であるようにデザインされていますが、いくつかのプラットフォームでは、その根底にあるアーキテクチャや性能による微妙な動作の違いや制限があります。

## 全てのプラットホーム

- `loop.add_reader()` と `loop.add_writer()` をファイル I/O を監視するためには使えません。

- `loop.connect_read_pipe()` and `loop.connect_write_pipe()` cannot be used with regular files. See Supported pipe objects for the objects that are accepted on each platform.

## 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()` の2つのメソッドは未実装です。

- Subprocesses はサポートされていません。すなわち `loop.subprocess_exec()` と `loop.subprocess_shell()` の2つのメソッドは未実装です。

`ProactorEventLoop` は以下の制限があります:

- `loop.add_reader()` と `loop.add_writer()` はサポートされていません。

- `loop.connect_read_pipe()` and `loop.connect_write_pipe()` only accept a handle opened for overlapped I/O. See Supported pipe objects for which objects are supported.

Windows のモノトニッククロックの時間分解能は、通常約15.6ミリ秒です。最高分解能は0.5ミリ秒です。分解能はハードウエア (HPET が利用可能かどうか) および WIndows の設定に依存します。

### Windows におけるサブプロセスのサポート

Windows において、デフォルトのイベントループ `ProactorEventLoop` はサブプロセスをサポートしますが、 `SelectorEventLoop` はサポートしません。

## macOS

最近の macOS バージョンは完全にサポートされています。

10.8 以前の macOS

macOS 10.6, 10.7 および 10.8 では、デフォルトイベントループは `selectors.KqueueSelector` をしていますが、このクラスはこれらの macOS バージョンのキャラクターデバイスをサポートしていません。これらの macOS バージョンでキャラクターデバイスをサポートするためには `SelectorEventLoop` で `SelectSelector` または `PollSelector` を使うように手動で設定します。以下はその例です:

    import asyncio
    import selectors

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