在node.js'vm'模块中运行多个并发脚本
关于node.js中的“vm”模块,在多个“vm”中实例化和运行脚本的最佳方法是什么? 我的目标是创build多个“虚拟机”,并能够在每个虚拟机中同时运行脚本。
一些具体问题我一直没有find答案:
- 每个“虚拟”运行在自己的线程(或作为一个单独的进程)?
- 是否支持callback机制,以便脚本可以让调用代码知道它已经完成了等等?
- 承诺或asynchronous/等待支持?
我相信答案已经在那里了,但是因为“虚拟现实”是一个过度使用的术语,所以我很难find很多有用的信息。
对于你的用例来说,使用node.js中的
child_process.fork()
模块似乎更好,在vm中运行脚本并不是一个好的做法,而且很难保证安全。child_process已经实现了callback机制,所以你可以很容易地分配完成处理程序。
为了回答你的问题,我做了一个小脚本:
const vm = require('vm'); const sandbox = { cb: (err, data) => { if (err) console.log(err); console.log(data); }, }; const code = ` function test() { cb(null, 'from vm'); } test(); `; process.nextTick(() => { console.log('from event loop'); }); vm.runInNewContext(code, sandbox);
脚本的结果是:
from vm from event loop
这给了我下面的结论:
每个“虚拟”运行在自己的线程(或作为一个单独的进程)?
不, vm同步运行。 如果它是asynchronous运行的,那么进程下一个tick会把console.log()
放在libuv队列的前面,所以我们from event loop
获取from event loop
然后再from vm
获得from event loop
。
是否支持callback机制,以便脚本可以让调用代码知道它已经完成了等等?
实际上,它本身并不支持,但是你可以用我在沙箱中callback
的方式来编写代码,而且vm
和你的代码之间的单一共享状态是global
variables。