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

In a native node module, how can I make sure that my async code is always running on the same thread?

本文关键字:代码 我的 异步 运行 线程 一线 模块 节点 何确保 确保      更新时间:2023-09-26

我正在用c++编写一个本地节点模块,这将是一个C库的绑定。

本标准库中的一些对象只能由单个线程使用。这意味着,如果我使用uv_queue_work,我不能确保它们只由同一个线程使用,因为- 据我所知 - libuv使用线程池,我还没能找到如何告诉它使用什么线程用于这种工作。

这里有一些针对这种情况的想法,但我不确定哪个是正确的方法。

  • 简单地使所有的方法同步-这将不幸地违背节点的目的和概念,所以我宁愿不
  • 创建一个自定义线程并在上面执行我的代码——这将破坏libuv线程池的目的,并且需要更多的工作
  • 告诉libuv以某种方式在其线程池中的同一线程上执行相同对象的操作-我在文档中没有找到这样做的方法

对于这种Node.js模块,推荐的操作过程是什么?

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

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

操作完成后,您可以将所需的js回调传递给MakeCallback