【问题标题】:Ways to implement CPU bound tasks in nodejsnodejs中实现CPU绑定任务的方法
【发布时间】:2012-06-04 14:38:54
【问题描述】:

我正在将 nodejs 用于 Web 服务器,它解码 GET 参数并以某种编码格式返回数据。解码/编码是使用 nodejs 的 crypto 模块完成的,这似乎是同步的。虽然服务单个请求所花费的时间足够快,但阻塞事件循环使服务在并发性方面表现不佳。

我的要求很简单,将编码/解码功能放在事件循环之外。

  1. 独立进程(子进程或集群)

这可以是一个单独的进程,仅用于此目的,但由于编码/解码将在子进程中阻塞,这将阻止子进程接收新消息,即永远不会出现编码两个字符串的情况因为子进程也将是单线程的。

  1. 为每个请求使用单独的线程(threads-a-gogo 或 Fiber 或 node-webworker)

为每个请求创建一个单独的线程来执行编码/解码操作,但似乎没有一个模块按预期工作,即threads-a-gogo没有通过npm安装,fiber没有创建一个单独的run() 上的线程,node-webworker not working

是否有人遇到过类似的问题,或者有什么方法可以通过简单的消息传递轻松地在 nodejs 中创建线程。

【问题讨论】:

  • 答案是#1,您需要将阻塞/主动等待转变为被动事件驱动风格
  • 我认为 CPU 绑定的任务和节点不太合适。那么你最好使用 Java 为例,让 node/java 有效地相互通信。
  • 我知道 nodejs 中的 CPU 绑定任务很糟糕,因此希望内置的加密模块可以单独处理。但是除了在 Java/C 上中继之外没有其他选择吗?

标签: node.js web-worker child-process fibers


【解决方案1】:

这是内置在节点的子进程中的。文档在这里:

http://nodejs.org/api/child_process.html#child_process_child_send_message_sendhandle

你也可以使用集群:

http://nodejs.org/api/cluster.html#cluster_cluster_fork_env

使用集群,它的工作方式类似于:

if (cluster.isMaster) {
  var worker = cluster.fork();
  worker.send('encodeThisString');

} else if (cluster.isWorker) {
  process.on('message', function(msg) {
    var encrypted = crypto.doSomeEncryption(msg);
    process.send(encrypted);
  });
}

【讨论】:

    猜你喜欢
    • 2021-07-12
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多