The selectors module API is deliberately very narrow:
- The
register() / modify() methods only accept events as a bitmask of EVENT_READ | EVENT_WRITE
- The
select() method only ever returns combinations of EVENT_READ | EVENT_WRITE
This design makes it impossible to use many platform-specific events provided by the underlying OS APIs (poll, epoll, kqueue). For example, #79698 describes a use case for EPOLLEXCLUSIVE on Linux. The biggest missed opportunity, however, is the inability to fully exploit kqueue() on BSD / macOS, which would allow async handling of regular files, signals, and others (see KQ_EVENT_*).
This limitation is relevant for asyncio, which uses the selectors module. For instance, on BSD / macOS, asyncio could be notified when a process terminates, enabling an optimization similar to #144047. Currenly asyncio on Linux already takes advantage of this approach via os.pidfd_open() + selectors.PollSelector (see source), but can't do the same for BSD / macOS because selectors.KqueueSelector doesn't allow registering custom select.kevent() objects.
Whereas it would be relatively easy to add a register_kevent() method, or to pass EPOLL* events directly to register(), it's less clear how the select() method should behave in this case, since it's apparently bound to the promise of returning either EVENT_READ or EVENT_WRITE.
The
selectorsmodule API is deliberately very narrow:register()/modify()methods only accepteventsas a bitmask ofEVENT_READ|EVENT_WRITEselect()method only ever returns combinations ofEVENT_READ|EVENT_WRITEThis design makes it impossible to use many platform-specific events provided by the underlying OS APIs (
poll,epoll,kqueue). For example, #79698 describes a use case forEPOLLEXCLUSIVEon Linux. The biggest missed opportunity, however, is the inability to fully exploitkqueue()on BSD / macOS, which would allow async handling of regular files, signals, and others (see KQ_EVENT_*).This limitation is relevant for
asyncio, which uses theselectorsmodule. For instance, on BSD / macOS,asynciocould be notified when a process terminates, enabling an optimization similar to #144047. Currenlyasyncioon Linux already takes advantage of this approach viaos.pidfd_open()+selectors.PollSelector(see source), but can't do the same for BSD / macOS becauseselectors.KqueueSelectordoesn't allow registering customselect.kevent()objects.Whereas it would be relatively easy to add a
register_kevent()method, or to passEPOLL*events directly toregister(), it's less clear how theselect()method should behave in this case, since it's apparently bound to the promise of returning eitherEVENT_READorEVENT_WRITE.