在本地节点模块中,如何确保asynchronous代码始终在同一线程上运行?
我正在用C ++编写一个本地节点模块,它将成为一个C库的绑定。
该库中的一些对象只能由单个线程使用 。 这意味着,如果我使用uv_queue_work
我不能确保它们只被同一个线程使用,因为 – 据我所知 – libuv使用线程池,我还没有能够找出如何告诉它什么线程用于这种工作。
这里有一些关于情况的想法,但是我不确定哪个是正确的方法。
- 简单地使所有的方法同步 – 这将不幸击败节点的目的和概念,所以我不想
- 创build一个自定义的线程,并执行我的代码 – 这将打败libuv的线程池的目的,并需要更多的工作
- 告诉libuv以某种方式执行相同的对象在其线程池中相同的线程的操作 – 我还没有find一种方法在文档中做这个
这种Node.js模块的推荐scheme是什么?
虽然我会开始说不幸的是,架构不支持通用callback模型,我会接受这是一个无法避免的特殊情况。
您仍然可以在本机模块中完全访问libuv API,因此完全可以使用该单个线程来创build自己的线程来安排所有适用的asynchronous工作。 快速入门检查http://nikhilm.github.io/uvbook/threads.html
操作完成后,您可以将所需的jscallback传递给MakeCallback
。 这应该允许任何js API交互显示正常。