我正在学习libev,但偶然发现了这个问题。假设我想尽快但不立即处理某些事情(即不在当前执行函数中)。例如,我想将一些大型同步作业分成多个要排队的部分,以便其他回调可以在两者之间触发。换句话说,我想安排超时0的回调。

因此,第一个想法是将ev_timer与超时0一起使用。第一个问题是:这样有效吗? libev是否可以将0超时计时器转换为有效的“尽快呼叫”作业?我认为不是。

我一直在研究libev's docs,也发现了其他选择:


它可以通过使用prepare或idle观察程序来人为地延迟调用回调


因此,闲置的观察者在这里可能不会很好,因为


当没有其他相同或更高优先级的事件挂起时,空闲观察者将触发事件


这可能不是我想要的。准备观察者可能会在这里工作。但是为什么不检查观察者呢?我所说的上下文有什么重要区别吗?

这些文档建议的另一个选择是:


或更偷偷地通过重用现有的(已停止的)观察程序并将其推入挂起的队列中:


ev_set_cb (watcher, callback);
ev_feed_event (EV_A_ watcher, 0);


但这将要求始终停下来观察。另外,由于我不知道先验的是我想同时调度多少个电话,因此我将不得不拥有多个观察者,并通过某种列表跟踪他们,并在需要时增加它。

那么我在正确的轨道上吗?这些都是可能性吗?还是我缺少一些简单的东西?

最佳答案

您可能想签出ev_prepare观察者。该事件计划作为给定事件循环迭代中的最后一个处理程序执行。它可用于“尽快执行此任务”实施。您可以为要执行的每个任务创建专用的观察程序,也可以使用一个准备观察程序来实现队列,一旦队列包含至少一个任务,该准备观察程序就会启动。

另外,您可以使用ev_idle监视程序实现类似的机制,但是这一次,只有在应用程序不处理任何“更高优先级”监视程序处理程序时,才会执行该机制。

关于c - Libev:如何安排回调尽快被调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42856114/

10-12 14:53