【问题标题】:node.js run function in child process?node.js 在子进程中运行函数?
【发布时间】:2016-04-25 20:38:03
【问题描述】:

我有一个 node.js 应用程序,它通过网络请求接收文件,然后将转换过程应用于该文件。由于任务长时间运行,因此需要与主线程分开运行。

目前我刚刚通过setTimeout() 调用了必要的代码。为了将主应用程序与转换进程隔离开来,我想将它移到一个子进程中,因为它运行时间很长,我想将主代码与正在完成的工作隔离开来(我是不是太担心了?)。目前我正在打电话:

const execFile = require('child_process').execFile;
const child = execFile('node', './myModule.js', (error, stdout, stderr) => {
  if (error) {
    throw error;
  }
  console.log(stdout);
});

这是 node.js 中的正确方法,还是简单地使用指定的模块和参数启动子进程,但不必将“节点”指定为可执行文件?

【问题讨论】:

  • 您对这种方法有什么特别的问题吗?这是启动新进程的几种方法之一(.spawn().exec() 相似)。我可以告诉您,您的 throw error 没有任何用处,因为在任何有用的地方都无法捕获常规异步回调,因此它与 return 没有什么不同。
  • 您的长时间运行的进程是受 CPU 限制还是受 IO 限制?该问题的答案对于确定使用哪种方法非常重要。
  • 我的上面的代码是基于我的一个例子。我希望避免显式引用“节点”命令,但如果这不被视为问题,那么我很好。至于 CPU/IO,它是一个视频转换过程,所以可能两者兼而有之。不过,我现在看到视频转换过程实际上是在后台生成一个外部进程 (ffmpeg),所以我可能不需要担心分叉(我原以为它使用了一个库)。
  • @AndreM:嗨,我可以知道在这个例子中我们应该如何在 UI 中显示结果吗?你能看看我的问题吗? stackoverflow.com/questions/53694567/…

标签: javascript node.js child-process


【解决方案1】:

刚刚看到 node.js 提供了 'fork' 函数,用于执行模块,尽管它们需要像期待命令行参数一样编写,处理 process.argv 数组。

命令调用是:

child_process.fork(modulePath[, args][, options])

更多详情here.

在我的特定情况下,分叉可能没有意义,因为我正在使用的 node.js 库已经创建了一个分叉。

【讨论】:

  • 每条单独的消息是否完全相互隔离?即,如果我向子进程分叉发送两条消息,它们会完全独立运行吗?
  • 是的,我刚刚测试过。并且像 global.window 这样的全局变量不会被共享
猜你喜欢
  • 2015-08-19
  • 1970-01-01
  • 1970-01-01
  • 2013-08-19
  • 2014-11-06
  • 2012-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多