5

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

所以第一个想法是ev_timer与 timeout一起使用0。第一个问题是:效率高吗?libev 是否​​能够将0超时计时器转换为高效的“尽快调用”工作?我认为不是。

我一直在研究libev 的文档,还发现了其他选项:

它可以通过使用准备或空闲观察者人为地延迟调用回调

所以空闲的观察者在这里可能不会很好,因为

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

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

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

或者更偷偷摸摸地,通过重用现有的(停止的)观察者并将其推入待处理队列:

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

但这需要始终有一个停止的观察者。此外,由于我事先不知道我想同时安排多少个电话,所以我必须有多个观察者,并另外通过某种列表跟踪它们,并在需要时增加它。

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

4

1 回答 1

2

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

或者,您可以使用 watcher 实现类似的机制ev_idle,但是这一次,它将仅在应用程序不处理任何“更高优先级”的 watcher 处理程序时执行。

于 2017-06-14T15:37:16.753 回答