当我们致电:
var p = require(child_process);
我们是否已经在创建子流程了? (如果没有,这里的p
是什么?)
为了解释我的困惑,在我拿起的代码库中,我看到了:
var childProcess1 = require("child_process");
var _retrieveChild = childProcess1.fork(
__dirname + '/backgroundProcesses/DadProcess',
{ execArgv: ['--debug=5859'] }
);
我问自己,是否正在创建一个来自子进程的另一个进程,或者childProcess1
只是一个非常明确的名称?
答案 0 :(得分:14)
要求模块可以有时初始化模块,所以不要因为不知道而感到难过。他们都是不同的。但是,child_process
只需要像您一样要求使用模块,就可以不创建流程。您必须调用fork()
或spawn()
(或exec()
)来实际创建新进程(和PID)。
如果查看文档,您可以看到他们有时会使用这种语法:
var spawn = require('child_process').spawn;
// ...
spawn('ps', ['ax']);
基本上抓取了模块API,然后是spawn
方法,并将其别名为局部变量,以便稍后在代码中使用。
修改的
为了便于您理解,只需在Node模块内部,模块决定要“导出”的内容。无论它输出什么,都将从require(...)
电话中返回。例如,如果我们有这个模块:
// foo.js
module.exports = function() {
return "bar";
};
然后require("foo")
会给我们一个函数(但它还没有被调用):
var mymodule = require("foo");
var result = mymodule(); // <-- this calls the function returned via module.exports
console.log(result); // "bar"
答案 1 :(得分:3)
child_process
module充当spawn
,exec
,execFile
和fork
函数的命名空间。您调用require("child_process")
来引用该模块,然后调用其中一个成员函数来创建一个新进程。
每个函数的返回值为ChildProcess
object,表示生成的进程,并包含stdin
,stdout
和pid
等成员。
答案 2 :(得分:0)
如果您对它的作用有疑问,请检查它返回的内容。
var childProcess = require('child_process')
console.log(childProcess);
你可能会这样(取决于Node.js版本):
{ ChildProcess:
{ [Function: ChildProcess]
super_:
{ [Function: EventEmitter]
EventEmitter: [Circular],
usingDomains: false,
defaultMaxListeners: 10,
init: [Function],
listenerCount: [Function] } },
fork: [Function],
_forkChild: [Function],
exec: [Function],
execFile: [Function],
spawn: [Function],
spawnSync: [Function: spawnSync],
execFileSync: [Function: execFileSync],
execSync: [Function: execSync] }
ChildProcess的最新节点版本docs。