libuv:uv_check_t和uv_prepare_t用法
我一直在阅读libuv书 ,但检查和准备观察的部分是不完整的,所以我发现的唯一信息是在uv.h:
/ * * uv_prepare_t是uv_handle_t的子类。 * *每个活动的准备句柄在每个循环中只调用一次 *迭代,就在系统阻塞之前等待完成的I / O。 * /
和
/ * * uv_check_t是uv_handle_t的子类。 * *每个活动的检查句柄在每个循环中调用一次 *迭代,在系统从阻塞返回之后。 * /
我想知道是否有任何libuv的检查和准备看守人的特殊用法。
我正在编写一个本地node.js绑定到一个c ++库,需要处理从不同线程触发的事件,所以自然,应该从主线程调用callback。 我尝试使用uv_async_t
,但是libuv不保证每一个uv_async_send
调用一次callback,所以这对我不起作用。
这就是为什么我决定去我自己的线程安全的事件队列,我想定期检查。 所以我想知道是否使用支票或准备观察员可以为此目的。
实际上,我当前的解决scheme确实使用了uv_async_t
监视器 – 每当我收到一个事件,我就把它放在队列中, 并调用uv_async_send
– 所以当最后调用callback函数时,我会处理当前队列中的所有事件。
我对这种方法的担心是,许多事件可能实际上排队等待,直到callback被触发,同时可能失效(通过无效,我的意思是在这一点上处理它们变得毫无意义)。
所以我希望能够尽可能频繁地检查事件队列 – 观察者可以提供哪些检查/准备, 但是在每个事件循环迭代中,这样做可能是矫枉过正的(并且locking一个互斥锁)?
而且,更重要的是, 也许他们应该服务于更多的特殊用途,而不仅仅是确保一次循环迭代callback调用?
谢谢
你可以使用一个准备句柄来检查你的队列中的事件,以及一个asynchronous句柄来唤醒循环。
如果只使用一个准备句柄,则可以在循环被I / O阻塞的情况下进入,没有人会处理队列,直到完成轮询。 asynchronous句柄会“唤醒”循环,下次准备句柄时,你会处理队列。