所遇问题
现有一个与python脚本通信的node服务。 首先:启动node服务一切正常。接口请求的时候执行python脚本,CPU飙升,请求完毕CPU降低 然后:我把node服务关闭的时候,原来的子进程竟然占据着CPU内容不放!
前提
首先:python脚本只能加载一次。不然太耗时。所以每次请求都加载脚本启动子进程然后杀掉不可取。
代码如下
const path = require('path');
const { exec } = require('child_process');
const pyPath = path.join(think.ROOT_PATH, '/src/tools/AIgobang/');
const child = exec('python move.py', { cwd: pyPath});
...
child.stdin.resume()
child.stdin.write('传入脚本的值')
child.stdout.once('data', (data) => {
console.log(data)
})
CPU占据情况如下
启动服务状态 关闭服务状态
问题罗列
- 如何避免node服务关闭后,python进程占据着CPU不放的问题
- 我的代码是否有需要优化的地方,例如与子进程通信的性能上
你要监听自己的退出事件,然后杀掉子进程啊。
process.kill(-process.pid) 试下这个,在关闭的时候调用一下这个代码
@lblblong 这并不是关键点,关键点在于:父进程异常退出的时候,也要优雅的干掉子进程
父进程 fork子进程,子进程再fork孙进城,这时候,父进程可关闭,子进程作为守护进程运行。可百度 linux fork两次
来自酷炫的 CNodeMD
我是这么玩的,代码片段:
const cp = child.exec(cmd);
// 1分钟后将node子进程关掉,只保留执行脚本的进程
const timer = setTimeout(function() {
cp.kill();
console.log('node子进程已关闭');
}, 60 * 1000);
我的使用场景是:程序启动的时候需要使用node执行一次shell命令(只要执行就行了,不需要处理反馈)。
@atian25 childprocess.fork 不是可以自动释放子进程的资源的吗?上述问题使用fork代替exec这样可行?
python脚本可以修改的话,可以在python启动时,注册一个服务,去监听主进程的存活状态,一但主进程消失,则自我毁灭。主进程的pid可以通过起动python时的参数传递过去。