Node多进程开发进阶
正在加载今日诗词....2022-04-07
疑问和收获
- exec 和 execFile 到底有什么区别?
- 为什么 exec/execFile/fork 都是通过 spawn 实现的,spawn 的作用到底是什么?
- 为什么 spawn 调用后没有回调,而 exec 和 execFile 能够回调?
- 为什么 spawn 调用后需要手动调用 child.stdout.on(‘data’, callback),这里的 child.stdout / child.stderr 到底是什么?
- 为什么有 data/error/exit/close 这么多种回调,它们的执行顺序到底是怎样的?
Node 多进程源码总结
- exec/execFile/spawn/fork的区别
- exec:原理是调用 /bin/sh -c 执行我们传入的 shell 脚本,底层调用了 execFile
- execFile:原理是直接执行我们传入的 file 和 args,底层调用 spawn 创建和执行子进程,并建立了回调,一次性将所有的 stdout 和 stderr 结果返回
- spawn:原理是调用了 internal/child_process,实例化了 ChildProcess 子进程对象,再调用 child.spawn 创建子进程并执行命令,底层是调用了 child._handle.spawn 执行 process_wrap 中的 spawn 方法,执行过程是异步的,执行完毕后通过 PIPE 进行单向数据通信,通信结束后会子进程发起 onexit 回调,同时 Socket 会执行 close 回调
- fork:原理是通过 spawn 创建子进程和执行命令,采用 node 执行命令,通过 setupchannel 创建 IPC 用于子进程和父进程之间的双向通信
- data/error/exit/close回调的区别
- data:主进程读取数据过程中通过 onStreamRead 发起的回调
- error:命令执行失败后发起的回调
- exit:子进程关闭完成后发起的回调
- close:子进程所有 Socket 通信端口全部关闭后发起的回调
- stdout close/stderr close:特定的 PIPE 读取完成后调用 onReadableStreamEnd 关闭 Socket 时发起的回调
exec 源码深入分析
- child_process
- exec
- execFile
- spawn
- internal/child_process
- ChildProcess
- spawn

Node 多进程回调流程
- spawn
- Pipe
- onexit
- kill
- Socket
- close
- exit

Node 多进程执行阶段总结

Fork 执行流程分析
核心区别是创建 IPC Channel 取代 [stdin, stdout, stderr]
同步方法源码分析
核心是调用 Process.spawnSync
知识储备
shell的使用
方法一:直接执行shell文件
/bin/sh test.shell
方法二:直接执行shell语句
/bin/sh -c "ls -al|grep node_modules"
Copyright © 2022 @filway