При использовании vm2 в worker_threads можно ли совместно использовать экземпляр NodeVM между работниками? - PullRequest
0 голосов
/ 17 января 2019

Я использую worker_threads и vm2 для реализации бессерверной вещи, но не могу получить экземпляр NodeVM в главном потоке, а затем пройти через workData (из-за ограничения worker_threads), поэтому яможет только new NodeVM в рабочем потоке для каждого запроса, внутри которого я не могу повторно использовать экземпляр vm, и стоимость ухудшается.

Для завершения new NodeVM() требуется 200 ~ 450 мс, поэтому я хочу выполнить предварительную инициализациюэкземпляр многократного использования.

const w = new Worker(`
    (async () => {
      const { workerData, parentPort } = require('worker_threads');
      const { NodeVM } = require('vm2');
      const t = Date.now();
      const vm = new NodeVM({ // cost 200 ~ 450 ms
        console: 'inherit',
        require: {
          external: [ 'request-promise', 'lodash' ],
          builtin: [],
          import: [ 'request-promise', 'lodash' ], // faster if added
        },
      });
      console.log('time cost on new NodeVM:', Date.now() - t);
      const fnn = vm.run(workerData.code, workerData.filename);
      console.log('time cost by initializing vm:', Date.now() - t);
      try {
        const ret = await fnn(workerData.params);

        parentPort.postMessage({
          data: typeof ret === 'string' ? ret : JSON.stringify(ret),
        });
      } catch (e) {
        parentPort.postMessage({
          err: e.toString(),
        });
      }
      console.log('----worker donex');
    })();
  `,
  {
    workerData: {
      params,
      code,
      dirname: __dirname,
      filename: `${__dirname}/faasVirtual/${fn}.js`,
    },
    eval: true,
  });

Кто-нибудь может дать мне какой-нибудь совет?

Большое спасибо.

1 Ответ

0 голосов
/ 17 января 2019

Я решил запретить импорт external модуля.Поскольку require является внутренне readFileSync, который стоит большую часть времени, а модуль http внутри самого узла может использоваться для замены request-promise.

После комментария external, среднее времястоимость init составляет примерно 10 + мс, что приемлемо на данный момент.

Но если worker_threads может клонировать объект функции через workerData, это будет более эффективным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...