1.安装child_process
npm install child_process --save
复制代码
child_process 子进程
在node中,child_process这个模块非常重要。掌握了它,等于在node的世界开启了一扇新的大门。熟悉shell脚本的同学,可以用它来完成很多有意思的事情,比如文件压缩、增量部署等,nodejs创建子进程有四种方法,分别是
spawn
、
fork
、
exec
、
execFile
。
区别 :
-
格式 : spawn和execFile的格式都是(command,[args]);fork的参数直接(文件名);exec的command相当于spawn的command+args;
-
回调 : spawn和fork没有直接的回调。spawn通过事件监听处理; fork相当于直接执行一个node程序;其余两个有回调,回调的参数为error,stdout,stderr;
-
作用 : [这里我也不是很明白,引用网上的],fork用于启动一个node进程,可以进程进程之间通信;execFile用于执行一个外部应用;spawn方法会在新的进程执行外部应用;exec这个方法将会生成一个子shell,能够在shell中执行命令。
2. 在package.json指向的主进程中
// 控制应用生命周期和创建原生浏览器窗口的模组
const {
ipcMain
} = require('electron')
// 多进程测试
const cp = require("child_process")
let mySpawn = new Array()
ipcMain.on('open-apifox', (e, msg) => {
console.log('打开进程 -> mainProcess:' + msg)
const spawn = cp.spawn(msg)
cps[cps.length] = spawn
e.sender.send('cp-reply', '打开进程:' + msg)
ipcMain.on('kill-apifox', (e, msg) => {
console.log('关闭进程 -> mainProcess:' + msg)
e.sender.send('cs-reply', '正在关闭所有打开的应用')
// 收到消息,关闭所有进程
for(i = 0; i < cps.length; i++) {
cps[i].kill()
cps = new Array()
复制代码
ipcMain
模块是类EventEmitter的实例.当在主进程中使用它的时候,它控制着由渲染进程(web page)发送过来的异步或同步消息.从渲染进程发送过来的消息将触发事件.详细说明请查看
www.cnblogs.com/zyl-Tara/p/…
**3. 在render渲染层中,触发事件引用外部的exe应用
<!DOCTYPE html>
<html lang="en">
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<div style="font-weight: bolder">3.打开外部程序,并监听消息</div>
<div class="form-group">
<input class="form-control" type="text" name="txt_exe" id="openApifox" style="width:600px"
placeholder="输入带路径的外部程序的名称" value="D:\apifox\apifox.exe" />
<div><button onclick="ChildProcess(true)">打开应用</button> <button onclick="ChildProcess(false)">关闭所有应用</button>
</body>
<script>
const ipcRenderer = require('electron').ipcRenderer
ipcRenderer.on('cs-reply', (e, msg) => document.getElementById('openApifox').value = msg )
function ChildProcess(isopen) {
// 发消息,由html的按钮调用,给主进程发消息,回调中关闭进程
let appname = ""
if (isopen) {
appname = document.getElementById('openApifox').value
console.log(appname)
ipcRenderer.send('open-apifox', appname)
} else ipcRenderer.send('kill-apifox', appname)
</script>
</html>
本文主要介绍node中跟进程相关的三个模块。process是node的全局模块,作用比较直观。可以通过它来获得node进程相关的信息,child_process主要用来创建子进程,可以有效解决node单线程效率不高的问题。cluster是node的集群模块,提供了开箱即用的进程创建功能。
执行一个外部的第三方应用的原理,和调用cmd执行命令是一样的,只不过可以添加程序的启动参数(`StartInfo.Arguments`)等。调用第三方应用,在其启动后,关于程序的操作、处理、是否...
Xcode警告消除 ios WKWebView Could not signal service com.apple.WebKit.WebContent
Appium问题解决方案(9)- Original error: Failed to launch Appium Settings app: Condition unmet after 5090 ms
【鸿蒙 HarmonyOS】界面跳转 ( Page Ability 的 action 标识 | Page Ability 之间的界面跳转及传递数据 | 鸿蒙工程下创建 Module | 代码示例 )(二)
【鸿蒙 HarmonyOS】界面跳转 ( Page Ability 的 action 标识 | Page Ability 之间的界面跳转及传递数据 | 鸿蒙工程下创建 Module | 代码示例 )(三)