我一直在阅读The libuv book,但是关于检查和准备观察者的部分是不完整的,所以我找到的唯一信息是在uv.h中:
/* * uv_prepare_t is a subclass of uv_handle_t. * * Every active prepare handle gets its callback called exactly once per loop * iteration, just before the system blocks to wait for completed i/o. */
和
/* * uv_check_t is a subclass of uv_handle_t. * * Every active check handle gets its callback called exactly once per loop * iteration, just after the system returns from blocking. */
我想知道libuv的检查和准备观察者是否有任何特殊用法。
我正在编写一个本机node.js绑定到需要处理从不同线程触发的事件的c ++库,所以自然地,应该从主线程调用回调。我尝试使用uv_async_t
,但libuv并不保证每uv_async_send
次调用一次回调,所以这对我不起作用。
这就是为什么我决定使用自己的线程安全事件队列,我想定期检查。所以我想知道使用支票或准备观察者是否可以用于此目的。
实际上,我当前的解决方案确实使用uv_async_t
观察者 - 每次收到事件时,我都会将其放入队列和调用uv_async_send
- 所以当回调时最后调用,我处理当前队列中的所有事件。
我对这种方法的关注是,许多事件实际上可能会排队,直到触发回调并且可能同时失效(通过无效,我的意思是此时处理它们变得毫无意义)。
所以我希望能够尽可能频繁地检查事件队列 - 检查/准备观察者可以提供哪些但是在每次事件循环迭代中执行它(并锁定互斥锁)可能是一种过度杀伤力?
而且,更重要的是,也许他们应该提供一些特殊目的,而不仅仅是确保每次循环迭代一次回调调用?
由于
答案 0 :(得分:2)
您可以使用prepare句柄检查队列中的事件,并使用异步句柄来唤醒循环。
如果你只使用一个准备句柄,你可能会遇到阻塞i / o循环的情况,并且在完成轮询之前没有人会处理队列。异步句柄会唤醒"唤醒"循环,下次准备句柄运行时,你将处理队列。