Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork34k
Description
Theselectors module API is deliberately very narrow:
- The
register()/modify()methods only accepteventsas a bitmask ofEVENT_READ|EVENT_WRITE - The
select()method only ever returns combinations ofEVENT_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 forEPOLLEXCLUSIVE on 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 (seeKQ_EVENT_*).
This limitation is relevant forasyncio, which uses theselectors module. For instance, on BSD / macOS,asyncio could be notified when a process terminates, enabling an optimization similar to#144047. Currenlyasyncio on Linux already takes advantage of this approach viaos.pidfd_open() +selectors.PollSelector (seesource), but can't do the same for BSD / macOS becauseselectors.KqueueSelector doesn't allow registering customselect.kevent() objects.
Whereas it would be relatively easy to add aregister_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_READ orEVENT_WRITE.