平台支持¶
asyncio
模块被设计为可移植的,但由于平台的底层架构和功能,一些平台存在细微的差异和限制。
所有平台¶
loop.add_reader()
和loop.add_writer()
不能用来监视文件I/O。
Windows¶
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.create_datagram_endpoint()
方法。不支持
loop.add_reader()
和loop.add_writer()
方法。
Windows上单调时钟的分辨率大约为 15.6 毫秒。最佳的分辨率是 0.5 毫秒。分辨率依赖于具体的硬件(HPET)和Windows的设置。
Windows的子进程支持¶
Windows上的 SelectorEventLoop
不支持子进程,使用 ProactorEventLoop
代替它:
import asyncio
asyncio.set_event_loop_policy(
asyncio.WindowsProactorEventLoopPolicy())
asyncio.run(your_code())
也不支持 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)