平台支持
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() 方法。
The resolution of the monotonic clock on Windows is usually around 15.6 milliseconds. The best resolution is 0.5 milliseconds. The resolution depends on the hardware (availability of HPET) and on the Windows configuration.
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)