Description
tokio
uses cooperative task yielding to improve tail latencies in the circumstance that a resource polled in a loop fails to yield, leading to starvation of other tasks. Something similar could be set up for async-io
as well.
The Reactor
already has a concept of "ticks", which are used to coordinate polling. My idea would be that each Source
keeps track of the tick which it last returned Poll::Pending
. If it compares tick
and this theoretical last_pending_tick
value and finds that the difference between the two is a large value (say, 10_000
, but this could use some tweaking), pooling the Source
automatically returns Pending
.
Any thoughts on this? This could be a global counter as well, or maybe a thread-local one.
I would be willing to implement this if the functionality is desired.