2017-09-20 19 views
1

node.jsの 'vm'モジュールに関しては、複数のVMでスクリプトをインスタンス化して実行するにはどうすればよいでしょうか?私の目的は、複数のVMを作成し、それぞれのスクリプトを同時に実行できるようにすることです。node.js 'vm'モジュールで複数の同時スクリプトを実行する

私は上の任意の答えを見つけることができていないいくつかの具体的な質問:

  • は独自のスレッド(または別のプロセスなど)上で実行する各「VM」をしていますか?
  • コールバックメカニズムがサポートされているため、スクリプトは呼び出し元コードに完了したことを知らせることができますか?
  • 約束または非同期/待機がサポートされていますか?

私は答えがそこにあると信じていますが、「VM」はそのような使いすぎの言葉なので、役に立つ情報を見つけるのは困難でした。ご利用の場合、それがあるために

答えて

1

は良い習慣と見なされていないVM内のスクリプトを実行しているのNode.jsからchild_process.fork()モジュールを使用することが良さそうですし、セキュリティを確保することは非常に困難です。

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'が実行されますかn自身のスレッド(または別のプロセスとして)?

いいえ、vmは同期して実行されます。もしそれが非同期的に実行されていたら、次のプロセスはconsole.log()をlibuvキューの前に押して、from event loopを最初に、そしてfrom vmを最初に得るでしょう。

コールバックメカニズムがサポートされているため、スクリプトは呼び出し元コードに完了したことを知らせることができますか?

実際にそれがネイティブサポートされていませんが、あなたは、私はサンドボックス内でcallbackで行った方法でコードを書くために管理することができ、vmとあなたのコードの間に単一の共有状態がglobal変数です。

+0

非常に興味深い。詳細をありがとうございます。 – eric

関連する問題