2012-03-05 18 views
2

。:免責条項:Node.js - 別のスレッドでスクリプトの実行を一時停止する

私はnode.jsで何かを達成しようとしていますが、これは設計原則に反している可能性があります。しかし、node.jsが "javascript is client side"の規範に反しているので、私はここでも何か違うことを試みています。私と一緒に抱きしめてください。

。:背景:

私は、単純化されたユーザーのための簡単なスクリプトのために、Javaスクリプトを説明する必要がある(最初から最後まで読む)必要があります。より高度なユーザー向けに非同期スクリプティング機能も提供します。

私はnode.jsのイベントドリブンの方法を理解しており、非同期コールバックに基づいたソリューションを用意しています。今私はより基本的なスクリプティング要件のためにこれを単純化しようとしています。

。:質問:

結果が配信されている間に実行を一時停止できるスクリプト(独自のサンドボックスを使用)を実行する方法はありますか。

など。

var util = require('util'), 
vm = require('vm'), 
user = require('user'); 

vm.runInThisContext('user.WaitForProceed(); console.log('Waiting over');'); 

console.log('Finished!'); 

ユーザーは待機を行う自分のモジュールです。基本的には、結果が返ってくるまで、そこに座ってVMオブジェクトのその行をブロックします。その後、console.log行に進みます。

この例の出力は、コールバックによっても達成できるので、重要ではありません。サンプルスクリプトの物語は、このソリューションにとってより重要です。

  • J
+0

これは、NORM(?)の "javascriptはクライアント側のためのもの"と宣言していますか、それともあなた(そして他の人)だけがそこでそれを見て、あなたが知っていた唯一のものを宣言したのですか?ノルム "?とにかく、一時停止する方法はありません。 JSマシンは引き続きイベントループを実行し、実行する必要がない場合にのみ停止します。したがって、停止する唯一の方法は、コードとイベントがなくなることです(イベントリスナーが接続された状態で)。あなたができる唯一のことは、その "進行"イベントを待つことです。 –

+0

... "あなたの"ユーザ "オブジェクトによって発砲されるイベントを持っている必要があります。しかし、あなたはすでにこのような解決策を持っていると言いました。そのために、JSエンジン自体が実際にどのように動作するのかが重要です。次に、このようなことについて、より良い気持ちになるでしょう。 –

+0

"...これはJSエンジン自体が実際にどのように働くかで重要なことです..."ノルムは他の人が私に物事が "うまくいくはず"と言う方法です。私はノードの限界と機能を理解していますが、すべての開発者と同様、そうでない人も扱っています。彼らはしかし、彼らの方法で、このシステムを使用したい。私は単に可能なことを探求します。 – Nevar

答えて

8

ノードで実行を一時停止する方法はありません。少なくとも彼らはそう教えて:)

ありInvokeのように、多分これが助けることができる、高度なフロー制御をサポートするいくつかのライブラリがありますが、私はそれはまた、あなたは可能性:)

を求めたものではないですが、理解してnextTick()

C(++)でブロッキング呼び出しを実装し、それをライブラリとして提供することができます。私はこれを決してしなかった。

最終的には、certianイベントで終了するnamedpipeにreadFileSync()があります。

すでに言及したように、それは言語の原則に反するため、これらのソリューションはすべてハッキーです。

+1

あります。ネイティブNode.jsアドオンを使用して...私の答えを参照してください。 –

+0

+1は、readFileSync/pipeの回避策です。卑劣で賢い –

+0

readFileSyncはまさに私が望むハックです – Prospero

2

結果を待っている間に実行を一時停止したい場合は、node-syncを使用してください。それはnode-fibersに基づいています。ノードの代わりにノードファイバースクリプトを使用してアプリケーションを実行する必要があります。 node-syncはsyncメソッドをFunction.prototypeに追加します。これにより、それを同期的に実行することができます。

また、イベントループをブロックしないようにファイバー(スレッド)でコールをラップする必要があります。

var Sync = require('sync'); 

var someAsyncFunction = function(a, b, callback) { 
    setTimeout(function() { 
     var result = a + b; 
     callback(undefined, result); 
    }, 1000); 
}; 

// Run in a fiber 
Sync(function(){ 
    // This code runs in separate fiber and does not block the event loop 

    // First argument is 'this' context 
    var result = someAsyncFunction.sync(null, 2, 3); 
    // Waiting one second 
    console.log(result); // Will output 5 
}); 

// Event loop here 

注意してください。あなたはそれがノードの方法ではないことを理解する必要があります。

+0

非常に良い。残念ながら私はsync関数呼び出しで実行を停止するためにメインスクリプトが必要です。そして、後で再び開始するように要求されます。これは私が達成する必要がある他のもののためにうまくいくでしょう。たぶん私はVMのランナーとしてこれを使用し、そのファイバを一時停止することができます。私は遊びをします。 – Nevar

+0

機能の動作中にメインイベントループの実行を停止する必要がある場合は、Sync(function(){})を削除してください。例からのラッパー。これにより、メインイベントループが一時停止されます。 –

7

Nodeプロセスの実行を本当にスリープ状態にしたい場合は、できます。しかし、あなたが述べるように、それはあなたがその意味を完全に認識しているようです。ここで

はこれを行うには、NPMモジュールです: https://github.com/ErikDubbelboer/node-sleep

あなたがそうのようにそれを使用することができます:

var sleep = require('sleep'); 
sleep.sleep(1); //sleep for 1 sec 
sleep.usleep(2000000); //sleep for 2 sec 

私は部分的にGoogleの検索で到着将来の訪問者のためにこれを書きます: 上記のテクニックは使用しないでください。必要があると判断した場合、これによりノードプロセスがブロックされ、スリープ期間が終了するまで追加の作業を実行できなくなることに注意してください。さらに、Node.jsプログラムが非ブロックであると想定されるため、Node.jsプログラムであることを認識しているすべてのユーザーの期待に反することになります。

幸運。

+0

ありがとう! vmをオフにすると、メインメッセージループが一時停止するのではないかと思います。問題は依然として、私はフォークオフプロセスを起こすために何か別のものが必要になるでしょう。たぶんファイバー(下記参照)が良い結果をもたらすでしょう。 – Nevar

+0

うーん、Erik Dubbelboerのスリープモジュールは本当に本当に窓を吸う。それはかなり容認できない。 –

+0

1)彼はWindowsに解決策が必要だとは言わなかった。2)これは1年以上前に投稿された。 3)最も重要なことは、Node.jsの実行スレッドを中断しようとすることは、ほとんどの場合、ひどい考えです。 –

関連する問題