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