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' }

然而,当我在咖啡脚本中重现该示例时,我只让父进程接收到来自子进程的消息;显然,子进程没有收到来自父进程的消息。

------------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 代码基本相同,只是包装在一个调用 this 的函数中。问题必须是范围之一,但我看不出如何解决它。毫无疑问,这对大师们来说是微不足道的,而且我已经束手无策了,所以我想我会问一下,以防有人好心给我指路。

达林·里德博士。

4

1 回答 1

5

不幸的是,这不像范围界定问题那么简单。问题是你的 fork 命令,在 JS 的情况下会启动一个新node进程,而在 CoffeeScript 的情况下会启动一个新的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 回答