在本机节点模块中,如何确保我的异步代码始终在同一个线程上运行?

时间:2013-05-06 20:57:18

标签: javascript c node.js node-modules libuv

我在C ++中编写一个本地节点模块,它将成为C库的绑定。

此库中的某些对象只能由单个线程使用。这意味着,如果我使用uv_queue_work,我无法确保它们仅由同一个线程使用,因为 - 据我所知 - libuv使用线程池而我还没有找到如何告诉它用于这种工作的线程。

以下是有关情况的一些想法,但我不确定哪种方法是正确的。

  • 简单地让所有方法同步 - 遗憾的是这会超出节点的目的和概念,所以我不想
  • 创建一个自定义线程并在其上执行我的代码 - 这会破坏libuv线程池的目的并需要更多工作
  • 告诉libuv以某种方式在其线程池中的同一个线程上执行相同对象的操作 - 我还没有在文档中找到一种方法来执行此操作

这种Node.js模块的推荐做法是什么?

1 个答案:

答案 0 :(得分:2)

虽然我首先要说架构不支持通用回调模型是不幸的,但我会接受这是一个无法避免的特殊情况。

您仍然可以完全访问本机模块中的libuv API,因此完全可以创建自己的线程,使用该单个线程来安排所有适用的异步工作。如需快速入门,请查看http://nikhilm.github.io/uvbook/threads.html

操作完成后,您可以将所需的js回调传递给MakeCallback。这应该允许任何js API交互看起来正常。