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

exec

Node 多进程回调流程

  • spawn
  • Pipe
  • onexit
  • kill
  • Socket
  • close
  • exit

callback

Node 多进程执行阶段总结

process

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

  • ☀️
  • 🌑