Запуск нескольких параллельных сценариев в модуле 'vm' node.js

1

Что касается модуля "vm" в node.js, каков наилучший подход к созданию и запуску скриптов в нескольких "vm"? Моя цель - создать несколько "vm" и иметь возможность запускать скрипты в каждом из них одновременно.

Некоторые конкретные вопросы, на которые я не смог найти ответы:

  • Каждый "vm" работает в своем потоке (или как отдельный процесс)?
  • Поддерживается ли механизм обратного вызова, поэтому скрипт может позволить вызывающему коду узнать, что он сделал и т.д.?
  • Поддерживаются ли обещания или async/wait?

Я считаю, что ответы там, но поскольку "vm" является таким чрезмерным термином, мне было трудно найти много полезной информации.

Теги:

1 ответ

1
Лучший ответ

Для вашего случая использования лучше использовать child_process.fork() из сценариев запуска node.js в vm, не считается хорошей практикой и очень сложно обеспечить безопасность.

у child_process уже установлен механизм обратного вызова, поэтому вы можете легко назначить обработчики при завершении.

Чтобы ответить на ваши вопросы, я сделал небольшой сценарий:

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" работает в своем потоке (или как отдельный процесс)?

Нет, vm работает синхронно. если он выполнял асинхронный процесс, следующий тик подталкивает console.log() перед очередью libuv, поэтому мы сначала получаем from event loop и from vm second.

Поддерживается ли механизм обратного вызова, поэтому скрипт может позволить вызывающему коду узнать, что он сделал и т.д.?

На самом деле он не поддерживается изначально, но вы можете писать код так, как я делал с callback в песочнице, единственным общим состоянием между vm и вашим кодом является global переменная.

  • 0
    Очень интересно. Спасибо за подробности.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню