ev_set_priority
,尽管有这个名字,它本身并不做你想做的事,它只会改变回调调用的相对顺序,除了一个例外:ev_idle
观察者。
对于ev_idle
观察者,当其他事件或较高优先级的空闲观察者未决时,确实不会调用较低优先级的观察者。例如,优先级为 0 的 ev_idle 观察者将在没有其他优先级为 0(默认)的未决观察者时被处理,即只有在没有其他优先级为 0 的事件未决时才会调用它。Libev 在做出这个决定之前会检查更多的事件,所以只要有优先级为 0 或更高的事件,它就不会调用优先级为 0 或更低的空闲观察者。
解决您的问题的一种方法是仅ev_idle
在 io 回调中为您的非首选套接字启动一个观察程序,其优先级等于 io 观察程序的优先级,导致在处理所有其他事件之前无法处理它。
一个细微的变化是在某种集合中标记您的低优先级 io 观察者并启动一个 ev_idle 观察者,然后它会遍历您集合中的所有套接字。
另一种完全不同的方法是研究可嵌入的事件循环并将所有较低优先级的 io 观察者移动到嵌入式循环中。在您的ev_embed
观察者回调中,您可以启动一个空闲观察者以稍后调用ev_embed_sweep
。这样做的好处是需要更少的空闲观察者,并将低优先级套接字的所有处理移动到它们自己的事件循环中,因此它们不会对您的高优先级 io 观察者造成额外的延迟问题。