node.js - Node.js 子进程的代码是否在每次生成时都会被解析?
问题描述
将长时间运行的任务外包给子进程是常见的做法。现在,我有一个长时间运行的函数(它会阻塞事件循环几秒钟),我想将它外包给一个子进程。每次调用此函数时,都会生成一个子进程,并在函数返回后关闭。Node.js 是否以某种方式缓存了该代码的中间表示,或者每次子进程产生时都会对其进行解析?代码是否在这些条件下得到优化?
幸运的是,根据我的测量,生成子进程并没有像我担心的那样增加开销。但是,如果代码每次都被解析并且从未得到优化,那将是资源的损失。
解决方案
Node.js 是否以某种方式缓存了该代码的中间表示,还是每次子进程产生时都会对其进行解析?
假设您正在谈论child_process.spawn()
,这将启动一个全新的进程,并且如果您正在运行 node.js 程序,它将是一个全新的 node.js 进程,它将从头开始从磁盘读取代码并再次解析它。
代码是否在这些条件下得到优化?
不清楚您所说的“代码是否得到优化”是什么意思。Node.js 将执行与在主进程或以spawn()
.
执行此操作而不是每次都启动一个新进程的更有效方法可能是创建一个持久的工作进程,您启动其中的几个,然后是一个工作队列,并将工作项传递给每个工作进程。他们完成工作并返回结果并继续运行等待下一个工作工作项。您可以使用任意数量的进程间通信方法与工作进程进行通信,从内置的 stdio 和 stdout 通信一直到使每个进程都成为您可以向其发送请求的本地端口上的 http 服务器。
这是工作进程,工作队列是您如何避免始终启动和关闭新进程的开销。
推荐阅读
- express - Express 中的异步控制器,用于将表单解析为 Mongoose
- javascript - 无法通过 ajax 发送文件( print_r($_FILES); Array ( ) )
- python - Seq2Seq 是否适合我的数据?
- java - 为什么与较少数量的线程相比,创建更多线程时总运行时间较慢
- r - R中的成对比较公式
- vue.js - Vuejs添加条件样式失败
- swift - 如何创建影响所有或特定 UIButton 实例类型的全局函数?
- r - 是否可以在 Ompr 优化中使用乘积表达式作为约束?
- javascript - 根据输入定义和替换变量
- java - JAVA中的老虎机无限循环问题