平臺支持?
asyncio 模塊被設(shè)計為可移植的,但由于平臺的底層架構(gòu)和功能,一些平臺存在細微的差異和限制。
所有平臺?
loop.add_reader()和loop.add_writer()不能用來監(jiān)視文件I/O。
Windows?
Windows上的所有事件循環(huán)都不支持以下方法:
不支持
loop.create_unix_connection()和loop.create_unix_server()。socket.AF_UNIX套接字相關(guān)參數(shù)僅限于Unix。不支持
loop.add_signal_handler()和loop.remove_signal_handler()。
SelectorEventLoop 有下列限制:
SelectSelector只被用于等待套接字事件:它支持套接字且最多支持512個套接字。loop.add_reader()和loop.add_writer()只接受套接字處理回調(diào)函數(shù)(如管道、文件描述符等都不支持)。因為不支持管道,所以
loop.connect_read_pipe()和loop.connect_write_pipe()方法沒有實現(xiàn)。不支持 Subprocesses ,也就是
loop.subprocess_exec()和loop.subprocess_shell()方法沒有實現(xiàn)。
ProactorEventLoop 有下列限制:
不支持
loop.create_datagram_endpoint()方法。不支持
loop.add_reader()和loop.add_writer()方法。
Windows上單調(diào)時鐘的分辨率大約為 15.6 毫秒。最佳的分辨率是 0.5 毫秒。分辨率依賴于具體的硬件(HPET)和Windows的設(shè)置。
Windows的子進程支持?
Windows上的 SelectorEventLoop 不支持子進程,使用 ProactorEventLoop 代替它:
import asyncio
asyncio.set_event_loop_policy(
asyncio.WindowsProactorEventLoopPolicy())
asyncio.run(your_code())
也不支持 policy.set_child_watcher() 函數(shù),ProactorEventLoop 有不同的機制來監(jiān)視子進程。
macOS?
完整支持流行的macOS版本。
macOS <= 10.8
在 macOS 10.6, 10.7 和 10.8 上,默認的事件循環(huán)使用 selectors.KqueueSelector,在這些版本上它并不支持字符設(shè)備。 可以手工配置 SelectorEventLoop 來使用 SelectSelector 或 PollSelector 以在這些較老版本的 macOS 上支持字符設(shè)備。 例如:
import asyncio
import selectors
selector = selectors.SelectSelector()
loop = asyncio.SelectorEventLoop(selector)
asyncio.set_event_loop(loop)
