3

假设我有 2 个套接字正在监视事件,并且我真的希望首选套接字 1(即使以使套接字 2 饥饿为代价)。我将如何用 libev 做到这一点(我在这里问了关于 libuv 的相同问题,但看起来 libuv 不能这样做)?

例如,在使用 libevent 时,可以使用:

int event_priority_set(struct event *event, int priority);

当多个优先级的多个事件激活时,不运行低优先级事件。相反,Libevent 运行高优先级事件,然后再次检查事件。只有当没有高优先级事件处于活动状态时,才会运行低优先级事件。

4

2 回答 2

1

检查 libev 函数ev_set_priority()

ev_set_priority (ev_TYPE *watcher, int priority)

设置和查询观察者的优先级。优先级是 EV_MAXPRI(默认值:2)和 EV_MINPRI(默认值:-2)之间的一个小整数。具有较高优先级的未决观察者将在具有较低优先级的观察者之前被调用,但优先级不会阻止观察者被执行(ev_idle 观察者除外)。

http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod#GENERIC_WATCHER_FUNCTIONS

于 2017-06-13T23:51:03.423 回答
1

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 观察者造成额外的延迟问题。

于 2018-06-14T23:31:28.250 回答