我正在学习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/