process模块详解(3)

const { spawn, exec, execFile, fork } = require('child_process'); const child = exec('node timer.js', { timeout: 300 }); child.on('exit', function(code, signal) { console.log(code); console.log(signal); }); // 输出结果 null SIGTERM

注意:由于timeout超时的时候error事件并不会触发,并且当error事件触发时exit事件并不一定会被触发

error事件的触发条件有以下几种:

无法创建进程

无法结束进程

给进程发送消息失败

注意当代码执行出错的时候,error事件并不会触发,exit事件会触发,code为非0的异常退出码

const { spawn, exec, execFile, fork } = require('child_process'); const child = exec('ls -l /usrs'); child.on('error', function(code, signal) { console.log(code); console.log(signal); }); child.on('exit', function(code, signal) { console.log('exit'); console.log(code); console.log(signal); }); // 输出结果 exit 1 null

message事件适用于父子进程之间建立IPC通信管道的时候的信息传递,传递的过程中会经历序列化与反序列化的步骤,因此最终接收到的并不一定与发送的数据相一致。

sub.js

process.send({ foo: 'bar', baz: NaN });

const cp = require('child_process'); const n = cp.fork(`${__dirname}/sub.js`); n.on('message', (m) => { console.log('got message:', m); // got message: { foo: 'bar', baz: null } });

关于message有一种特殊情况要注意,下面的message并不会被子进程接收到

const { fork } = require('child_process'); const forked = fork('child.js'); forked.send({ cmd: "NODE_foo", hello: 'world' });

当发送的消息里面包含cmd属性,并且属性的值是以NODE_开头的话,这样的消息是提供给Node.js本身保留使用的,因此并不会发出message事件,而是会发出internalMessage事件,开发者应该避免这种类型的消息,并且应当避免监听internalMessage事件。

message除了发送字符串、object之外还支持发送server对象和socket对象,正因为支持socket对象才可以做到多个Node.js进程监听相同的端口号。

未完待续......

参考资料

https://medium.freecodecamp.org/node-js-child-processes-everything-you-need-to-know-e69498fe970a
https://nodejs.org/dist/latest-v10.x/docs/api/child_process.html

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

您可能感兴趣的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/c07def3c1b600637c397fea9d9675781.html