我正在学习libev,我偶然发现了这个问题。假设我想尽快处理某些东西,但不是现在(即不在当前执行函数中)。例如,我想将一些大型同步作业分成多个部分,这些部分将被排队,以便其他回调可以在两者之间触发。换句话说,我想安排一个超时0
回调。
所以第一个想法是将ev_timer
与超时0
一起使用。第一个问题是:这是否有效?libev 是否能够将0
超时计时器转变为高效的"尽快呼叫"作业?我认为不是。
我一直在挖掘libev的文档,我也发现了其他选择:
它可以通过使用准备或空闲观察程序人为地延迟调用回调
所以闲置的观察者在这里可能不会很好,因为
空闲观察程序在没有相同或更高优先级的其他事件挂起时触发事件
这可能不是我想要的。准备观察程序可能在此处工作。但是为什么不检查观察者呢?在我所说的上下文中有什么根本的区别吗?
这些文档建议的另一个选项是:
或者更狡猾的是,通过重用现有的(已停止的)观察程序并将其推送到挂起的队列中:
ev_set_cb (watcher, callback);
ev_feed_event (EV_A_ watcher, 0);
但这需要始终有一个停止的观察者。另外,由于我不知道我想同时安排多少个呼叫,因此我必须有多个观察者,并通过某种列表跟踪它们并在需要时增加它。
那么我走在正确的轨道上吗?这些都是可能性还是我错过了一些简单的东西?
您可能需要查看ev_prepare
观察程序。该处理程序计划作为给定事件循环迭代中的最后一个处理程序执行。它可用于"尽快执行此任务"实现。您可以为要执行的每个任务创建专用观察程序,也可以使用一个准备观察程序实现队列,该观察程序在队列包含至少一个任务时启动。
或者,可以使用观察程序实现类似的机制ev_idle
但这一次,仅当应用程序不处理任何"更高优先级"的观察程序处理程序时,才会执行该机制。