【问题标题】:NodeJS Child Process can't send net.socket fd:3NodeJS子进程无法发送net.socket fd:3
【发布时间】:2017-01-21 23:42:24
【问题描述】:

在编写 nodejs 多线程包时,主线程可以通过 fd:3 发送内容并且线程可以接收消息,但随后线程无法通过 fd:3 发送回任何内容

我做错了什么吗? (threader.js:45-59 行是问题所在)

Package(目前仅在 github 上,我的包正在运行)

启动代码:

var Thread = require("threader");

var task = Thread.task(function(){
  //Do some calculation
}, function(){
  //When the calculation response has been sent
});
task('a', 2);

【问题讨论】:

  • 发送过程中有什么例子吗
  • 当一个线程启动时,如果正确注销“Loggin working”,那么它会添加一个新的 net.Socket({fd:3}).on('data') 并且当它获取任何数据时它应该只需注销“虽然 fd:3 in thread”,但在线程启动 10 毫秒后,它应该通过 net.socket 发送“I piped a thing”,然后在主线程中它应该说“Receive fd: 3 in主线程”,但这永远不会发生
  • 有趣的是,这段代码只会注销“从线程 0 发送”,而不是其他任何东西,它只是坐在那里运行,fd:3 可以自动关闭吗? > github.com/Hobgoblin101/Threader/blob/master/test2.js

标签: node.js multithreading sockets


【解决方案1】:

我刚刚发现了问题:

thread.js 就像一个套接字服务器,threader.js 就像一个客户端。
服务器必须在连接的上下文中响应。
由于您使用的 setTimeout 本身是一个单独的线程,无法访问连接上下文,因此线程程序无法侦听数据。

thread.js - 旧代码

pipe.on('data', function(chunk){
  console.log('RECEIVED CONENT THOUGH fd:3 in thread');
  console.log(chunk.toString());
});

setTimeout(function () {
  pipe.write('I piped a thing');
}, 2000);

thread.js - 新代码

pipe.on('data', function(chunk){
  console.log('RECEIVED CONENT THOUGH fd:3 in thread');
  console.log(chunk.toString());
});


pipe.write('I piped a thing');

thread.js - 新代码 - 最佳方式

pipe.on('data', function(chunk){
  console.log('RECEIVED CONENT THOUGH fd:3 in thread');
  console.log(chunk.toString());
  //Real 2 second work but not on a separate thread using setTimeout
  pipe.write('I piped a thing');
});

【讨论】:

  • 我认为超时只是在同一线程中延迟运行某些代码,而不是不同的。
【解决方案2】:

我只是从不同的角度重新编写了整个包,现在它可以工作了......

我认为问题与挑线有关。

修复将很快推送到 github。

【讨论】:

  • 我刚刚发布了答案。但无论如何,如果重写一个很棒,你应该继续这样做
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-05
  • 1970-01-01
相关资源
最近更新 更多