3

コーヒースクリプトを使い始めたばかりで気に入っていますが、イライラする問題に遭遇しました。プロセスとフォークされた子プロセスの間でメッセージを送受信する基本バージョンを JavaScript で再現すると、期待どおりの結果が得られます。これまでのところ、すべて順調です。

----------- app2.js -----------------------------

var child = require('child_process');
var forked = child.fork("./child2.js");

forked.on('message', function (msg) {
    console.log("parent recieved ", msg);
});

forked.send({hello:'world'});

---------- child2.js --------------------------------

process.on('message', function(m) {
    console.log("child received ", m);
});

process.send({foo:'bar'});

-------------- ノード app2.js の出力 -----

child received  { hello: 'world' }
parent recieved  { foo: 'bar' }

しかし、この例を coffeescript で再現すると、子プロセスからメッセージを受け取る親しか得られません。明らかに、子プロセスは親プロセスからメッセージを受け取りません。

-----------app.coffee --------------------------------

cp = require('child_process')
n = cp.fork("./child.coffee")

n.on 'message', (m) =>
    console.log 'PARENT recieved', m

n.send {foo:'hello from the parent process'}

---------- child.coffee ---------------------------

process.on 'message', (m) =>
    console.log 'CHILD received ', m

console.log "Child process running"

process.send {bar:'hello from the child process'}

-------------------- コーヒー app.coffee の出力 ----

Child process running
PARENT recieved { bar: 'hello from the child process' }

コンパイルされた JavaScript を見ると、(予想どおり) coffeescript をコンパイルした結果は元の JavaScript コードと本質的に同じであり、これを呼び出して関数にラップされていることがわかります。問題はスコープの 1 つでなければなりませんが、解決方法がわかりません。教祖にとっては些細なことであることは間違いないし、私はもう限界に来ているので、道を教えてくれる親切な人がいるなら聞いてみようと思った.

ダリン・リード博士.

4

1 に答える 1

5

残念ながら、これはスコーピングの問題ほど単純ではありません。問題は、JS の場合は新しいnodeプロセスを開始し、CoffeeScript の場合は新しいプロセスを開始する fork コマンドcoffeeです。

時間をかけて探してみないとはっきりとは言えませんが、問題は起動/コンパイル時間の違い、またはそれに関連するものです。

// Changing this line
n.send {foo:'hello from the parent process'}

// to this works for me
setTimeout (-> n.send {foo:'hello from the parent process'}), 300

'ready'最も簡単な解決策は、子プロセスから初期イベントを取得するまで、子にメッセージを送信しないことだと思います。したがってchild.coffee、最終的にコンパイルして完全にロードしたことを親プロセスに伝える初期メッセージを送信することができます。

于 2013-02-15T04:12:11.763 に答える