Node.js C ++ addon:来自不同线程的多个callback
我正在创build一个节点C ++插件,应该callback一个JS函数,因为事件是由不在我的控制下的其他线程触发的(它实际上是一个来自我使用的托pipeDLL的.NET线程)。 由于JS世界是单线程的,我不能只保留js函数引用,并从非js线程调用它。 我甚至不能创build我想传递给该线程callback函数的参数。
我已经看到uv_queue_work
被用在你想要从js线程移出工作的情况下,并且一旦完成并从js线程callback来做你需要做的任何事情,比如callback一个js函数。
为了以后的参考,这里是该函数的签名:
int uv_queue_work(uv_loop_t* loop, uv_work_t* req, uv_work_cb work_cb, uv_after_work_cb after_work_cb);
调用uv_queue_work对于一次性工作是很好的,我可能会经常通过从after_work_cb
链接调用uv_queue_work
来调用我,而work_cb
与其他线程同步,但是我不知道是否没有更直接的方法这样做。
就像node.js提供的fn一样,它可以被任何其他线程直接调用,而fn指针指向下一次在主js线程上执行的代码。 任何想法?
而不是使用uv_queue_work,你应该看看uv_async_ *函数(查看https://github.com/joyent/libuv/blob/master/include/uv.h )。
一个非常好的实现可以在节点sqllite项目https://github.com/developmentseed/node-sqlite3/blob/master/src/async.h中find 。
不过要注意的是,如果你对这些东西不是非常小心的话,你最终会遇到一些TERRIBLE循环引用计数错误(应用程序退出提前,或根本不提供)