Libev:如何安排尽快调用的回调
Libev: how to schedule a callback to be called as soon as possible
我正在学习 libev,我偶然发现了这个问题。假设我想尽快处理一些事情,但不是现在(即不在当前执行的函数中)。例如,我想将一些大的同步作业分成多个部分,这些部分将被排队,以便其他回调可以在两者之间触发。换句话说,我想安排一个超时 0
.
的回调
所以第一个想法是使用ev_timer
with timeout 0
。第一个问题是:这有效吗? libev 是否能够将 0
超时计时器转换为高效的 "call as soon as possible" 作业?我假设不是。
我一直在研究 libev's docs,我也找到了其他选择:
it can artificially delay invoking the callback by using a prepare or idle watcher
所以空闲观察者在这里可能不会很好,因为
Idle watchers trigger events when no other events of the same or higher priority are pending
这可能不是我想要的。准备观察者可能会在这里工作。但是为什么不检查观察者呢?我所说的上下文有什么重要区别吗?
这些文档建议的另一个选项是:
or more sneakily, by reusing an existing (stopped) watcher and pushing it into the pending queue:
ev_set_cb (watcher, callback);
ev_feed_event (EV_A_ watcher, 0);
但这需要始终有一个停止的观察者。此外,由于我事先不知道我想同时安排多少个电话,所以我必须有多个观察者,并通过某种列表另外跟踪它们,并在需要时增加它。
那我走对了吗?这些都是可能性还是我错过了一些简单的东西?
您可能想查看 ev_prepare
观察器。那个被安排作为给定事件循环迭代中的最后一个处理程序执行。它可用于 'Execute this task ASAP' 实施。您可以为每个要执行的任务创建专用观察器,或者您可以使用一个准备观察器实现一个队列,一旦队列包含至少一个任务,该观察器就会启动。
或者,您可以使用 ev_idle
watcher 实现类似的机制,但这一次,它只会在应用程序不处理任何 'higher priority' watcher 处理程序时执行。
我正在学习 libev,我偶然发现了这个问题。假设我想尽快处理一些事情,但不是现在(即不在当前执行的函数中)。例如,我想将一些大的同步作业分成多个部分,这些部分将被排队,以便其他回调可以在两者之间触发。换句话说,我想安排一个超时 0
.
所以第一个想法是使用ev_timer
with timeout 0
。第一个问题是:这有效吗? libev 是否能够将 0
超时计时器转换为高效的 "call as soon as possible" 作业?我假设不是。
我一直在研究 libev's docs,我也找到了其他选择:
it can artificially delay invoking the callback by using a prepare or idle watcher
所以空闲观察者在这里可能不会很好,因为
Idle watchers trigger events when no other events of the same or higher priority are pending
这可能不是我想要的。准备观察者可能会在这里工作。但是为什么不检查观察者呢?我所说的上下文有什么重要区别吗?
这些文档建议的另一个选项是:
or more sneakily, by reusing an existing (stopped) watcher and pushing it into the pending queue:
ev_set_cb (watcher, callback);
ev_feed_event (EV_A_ watcher, 0);
但这需要始终有一个停止的观察者。此外,由于我事先不知道我想同时安排多少个电话,所以我必须有多个观察者,并通过某种列表另外跟踪它们,并在需要时增加它。
那我走对了吗?这些都是可能性还是我错过了一些简单的东西?
您可能想查看 ev_prepare
观察器。那个被安排作为给定事件循环迭代中的最后一个处理程序执行。它可用于 'Execute this task ASAP' 实施。您可以为每个要执行的任务创建专用观察器,或者您可以使用一个准备观察器实现一个队列,一旦队列包含至少一个任务,该观察器就会启动。
或者,您可以使用 ev_idle
watcher 实现类似的机制,但这一次,它只会在应用程序不处理任何 'higher priority' watcher 处理程序时执行。