【问题标题】:Can you prioritize events in libev?你能优先考虑 libev 中的事件吗?
【发布时间】:2016-11-25 13:18:45
【问题描述】:

假设我有 2 个套接字正在监视事件,我真的希望套接字 1 成为首选(即使以耗尽套接字 2 为代价)。我将如何使用 libev 来做到这一点(我问过关于 libuv here 的相同问题,但看起来 libuv 无法做到这一点)?

作为一个使用 libevent 的示例,可以使用:

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

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

【问题讨论】:

    标签: libev


    【解决方案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

    【讨论】:

      【解决方案2】:

      ev_set_priority,尽管有这个名字,它本身并不做你想做的事,它只会改变回调调用的相对顺序,有一个例外:ev_idle watchers。

      对于ev_idle 观察者,当其他事件或较高优先级的空闲观察者未决时,确实不会调用较低优先级的观察者。例如,优先级为 0 的 ev_idle 观察者将在没有其他优先级为 0(默认)的未决观察者时被处理,即仅当没有其他优先级为 0 的事件未决时才会调用它。 Libev 在做出这个决定之前会检查更多的事件,所以只要有优先级为 0 或更高的事件,它就不会调用优先级为 0 或更低的空闲观察者。

      解决您的问题的一种方法是仅在 io 回调中为您的非首选套接字启动一个 ev_idle 观察程序,其优先级等于 io 观察程序上的优先级,导致在所有其他事件之前无法处理它被处理。

      一个细微的变化是在某种集合中标记您的低优先级 io 观察者并启动一个 ev_idle 观察者,然后它会遍历您集合中的所有套接字。

      另一种完全不同的方法是研究可嵌入的事件循环并将所有较低优先级的 io 观察者移动到嵌入式循环中。在您的ev_embed 观察者回调中,您可以启动一个空闲的观察者稍后调用ev_embed_sweep。这样做的好处是需要更少的空闲观察者,并将低优先级套接字的所有处理转移到它们自己的事件循环中,因此它们不会对您的高优先级 io 观察者造成额外的延迟问题。

      【讨论】:

      • 感谢您的详细解答!我现在没有在做这个,但是当我回到它时,我一定会多加考虑
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-27
      相关资源
      最近更新 更多