nw.js node-webkit系列(25)child_process中spawn和exec方法的使用

child_process是nw.exe的一个内置模块,通过它可以实现创建多线程,并可实现主线程和子线程之间的通信。child_process模块中主要使用有两个方法spawn和exec,这两个方法都可以用来创建子线程。除了spawn和exec外,child_process模块还有execFile,fork,spawnSync,execFileSync,execSync,它们都是基于spawn的不同封装。

使用child_process模块模块不外乎几种情况:1.调用系统命令行 2.打开第三方软件 3.打开第三方软件并实现通信。

(一)child_process模块 Demo

[html]  view plain  copy
  1. var cp = require('child_process'); //子进程
  2. var result = "";
  3. cp.exec("ipconfig", function(error, stdout, stderr) {
  4. console.log("error", error);
  5. console.log("stdout", stdout);
  6. console.log("stderr", stderr);
  7. });
  8. result = cp.spawn('cmd.exe', ['/s', '/c', 'ipconfig']);
  9. result.on('close', function(code) {
  10. console.log('child process exited with code :' + code);
  11. });
  12. result.stdout.on('data', function(data) {
  13. console.log('stdout: ' + data);
  14. });
  15. result.stderr.on('data', function(data) {
  16. console.log('stderr: ' + data);
  17. });

以上两个方法无论是spawn还是exec都通过调用了命令行ipconfig获取系统相关IP信息,两者得到的结果是一样的,本Demo可看出只不过两种调用的写法不一样而已。

(二)spawn和exec的区别

(1)两者实现的写法不同,参照上述Demo即可了解。

(2)spawn在执行时会返回一个stdout和stderr流对象,为边执行边返回。exec是在执行完成后返回一个完整的buffer,这个buffer的大小应该是200k。如果子进程返回的数据大小超过了200k,程序将会崩溃,同时显示错误信息"Error:maxBuffer exceeded"。

(3)spawn在执行完成后会抛出close事件监听,并返回状态码,通过状态码可以知道子进程是否顺利执行。exec只能通过返回的buffer去识别完成状态,识别起来较为麻烦。

上述(一)中已经介绍如何调用系统命令行,下面为打开第三方软件的例子,如使用exec打开QQ程序:

[html]  view plain  copy
  1. var cp = require('child_process'); //子进程
  2. var path = "";//第三方根目录
  3. cp.exec(path + "\\QQ.exe", function(error, stdout, stderr) {
  4. console.log("error", error);
  5. console.log("stdout", stdout);
  6. console.log("stderr", stderr);
  7. });

打开第三方软件并通信,如使用spawn,调用ffmpeg进行转码:

[html]  view plain  copy
  1. var cp = require('child_process'); //子进程
  2. var path = ""; //第三方根目录
  3. result = cp.spawn(path + "\\ffmpeg.exe", ['-y', '-i', "1.mpg", '1.mp4']);
  4. result.on('close', function(code) {
  5. console.log('child process exited with code :' + code);
  6. });
  7. result.stdout.on('data', function(data) {
  8. console.log('stdout: ' + data);
  9. });
  10. result.stderr.on('data', function(data) {
  11. console.log('stderr: ' + data);
  12. });

综上所述,能使用spawn实现子进程的尽量使用spawn, 其一可以避免不必要的异常错误,其次在调用上较为规范。如果需要通过child_process模块反复调用某个第三方软件或程序,注意一点就是避免重复打开(如子进程进入死循环,或者子进程没结束就又重复打开),过多的子进程会消耗系统的资源,严重时可能会造成卡顿,死机等情况。如果遇到这种情况,可以通过.kill();方法停止线程运行。如上述使用spawn的例子中均有一个result,停止线程方法为:

[html]  view plain  copy
  1. result.kill();

如需强制关闭,如强制关闭ffmpeg.exe进程,可用:

[html]  view plain  copy
  1. function killFFmpeg() {
  2. cp.exec('tasklist | find "ffmpeg.exe"', function(error, stdout, stderr) {
  3. if(stdout != "") {
  4. cp.exec("taskkill /f /t /im ffmpeg.exe", function(error, stdout, stderr) {});
  5. }
  6. });
  7. };

nw.js环境下 调用第三方事例相关推荐

  1. 解决pip安装pygal在TensorFlow环境下调用失败问题

    欢迎关注微信公众号[计算机视觉联盟] 获取更多前沿AI.CV资讯 使用pip安装pygal在Linux和OS X系统中,执行的命令如下: pip install --user pygal==1.7 在 ...

  2. 在控制台环境下调用MFC DLL崩溃的问题小结

    使用MFC编写的DLL在MFC的程序中调用是没有任何问题的,但是如果在控制台环境下调用会出现崩溃的情况.解决方法如下,在MFC编写的DLL中添加下面一段代码,即可解决该问题: static AFX_M ...

  3. Pycharm环境下调用Qt desinger 常见问题以及解决方法

    Pycharm环境下调用Qt desinger 常见问题以及解决方法 前言 问题1: 提示QT由于找不到msvcp140d.dll无法继续执行代码或者相关问题 问题2: This applicatio ...

  4. Python在指定环境下安装第三方库的报错解决办法

    Python在指定环境下安装第三方库的报错解决办法 在python安装第三方库时,如果直接打开cmd命令提示符,并输入下列安装命令,则会默认安装在base环境下 但base环境下的包新建的虚拟环境是无 ...

  5. 关于JS调用Adobe Reader ActiveX插件,在web环境下调用本地打印机执行静默打印的实现

    因为之前被实施商的前端童鞋理直气壮的卡了脖子告诉我写不出来,让我很不爽,所以还是搜集了一些资料最终测试成功了.注意一下这个只能在IE10及以上的IE内核环境下可用(我只测试了这个环境,但是IE是没跑了 ...

  6. Node.js 环境下的 console.log 是同步执行的

    参考这个官网 通常,从您的应用程序进行日志记录有两个原因:用于调试和记录应用程序活动(本质上是其他所有内容).使用 console.log() 或 console.error() 将日志消息打印到终端 ...

  7. [go]沙盒环境下调用支付宝扫码支付

    参考于这篇博客,在此基础上进行了封装 配置支付宝开放平台 支付宝开放平台,使用支付宝扫码并成为开发者.然后进入沙盒进行测试 下载沙盒版支付宝并使用沙盒账号中的买家信息进行登陆,之后使用此账号登陆的支付 ...

  8. 转:多线程环境下调用 HttpWebRequest 并发连接限制

    .net 的 HttpWebRequest 或者 WebClient 在多线程情况下存在并发连接限制,这个限制在桌面操作系统如 windows xp , windows  7 下默认是2,在服务器操作 ...

  9. 多线程环境下调用 HttpWebRequest 并发连接限制

    .net 的 HttpWebRequest 或者 WebClient 在多线程情况下存在并发连接限制,这个限制在桌面操作系统如 windows xp , windows  7 下默认是2,在服务器操作 ...

最新文章

  1. 一个App卖了4亿美元,这家听声识曲公司为何得到Apple的青睐?
  2. shell脚本判断输入参数个数
  3. 【Nutch2.2.1基础教程之3】Nutch2.2.1配置文件
  4. matplotlib给坐标轴特定的位置加上文字
  5. java学习日记(9)———socket,网络编程的学习
  6. golang控制台颜色输出(for windows)
  7. DbVisualizer 使用方法 图解(可以连接多种数据库的客户端)
  8. 计算机在教学中应用论文,极域电子教室在计算机教学中的应用
  9. html 分割字符串,详解js常用分割取字符串的方法
  10. php文件格式,php是什么文件格式
  11. vue 富文本编辑器 Editor 使用
  12. 庄子 独与天地精神往来,而不敖倪于万物
  13. matlab output()函数,MATLAB - Data Output
  14. Spark MLlib系列(二):基于协同过滤的电影推荐系统
  15. HEVC中打印CU划分
  16. Rasa课程、Rasa培训、Rasa面试系列之 Rasa幕后英雄系列-机器学习研究员 Johannes
  17. 【产品】项目管理的五大阶段
  18. go 函数os.OpenFile
  19. css背景图片和背景颜色一起显示
  20. 用ios企业证书发布ipa到服务器上扫码下载

热门文章

  1. Arcgis使用教程(七)书签(BookMarks)操作使用方法
  2. 光驱无法识别,提示注册表信息不完整的解决办法
  3. App 接入91平台步骤
  4. 解决ecshop出现Warning: file_put_contents
  5. JAVASE零基础入门——package、封装、继承、访问权限修饰符、super、重写、Javabean 和 final 关键字
  6. 服装品牌SPA利器,成就谁的未来?
  7. wmm的学习日记(upload-labs)
  8. WMM: WiFi MultiMedia WiFi多媒体应用
  9. 5 mysql 凤舞天骄_凤舞天骄简单架设方法
  10. 一文看懂三极管在电路中的应用原理