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. linux进程--fork详解(二)
  2. Boost:易变的bimap双图的测试程序
  3. SQL基础【十一、分页 limit top rownum】
  4. 第六章 统计量及其抽样分布
  5. python单例_Python - 单例模式(Singleton)
  6. mysql 不在另一张表_mysql查询在一张表不在另外一张表的记录
  7. python快速入门课堂笔记_Python 快速入门笔记(9):模块和包
  8. (转)USB体系结构
  9. 整数的素因数权重分析
  10. java swing 升级_Swing - 更新标签
  11. php随机数怎么获取?一个简单的函数就能生成
  12. 使用Fraps获取3D程序的FPS
  13. wince 开发_正运动技术运动控制卡应用开发教程之Python
  14. [C#] Microsoft .Net框架SerialPort类的用法与示例
  15. ArcGIS Server学习资料
  16. step 7在win10上安装教程及安装包
  17. napi娃娃_第二十九章 干妈
  18. R语言函数(1)-par()函数
  19. Android Bitmap 保存图片透明背景变黑色背景
  20. python产生0101_GitHub - zhl0101/Python-100-Days: Python - 100天从新手到大师

热门文章

  1. 跟着鬼哥学android java hook(三)
  2. 瑞云效果图渲染价格实惠吗?
  3. 请教大家IMEI号手机与包装上面不一致是什么状况
  4. 踩坑了,BigDecimal 使用不当,造成P0事故!
  5. 学习笔记——XSLT转换器的使用(Xalan和Saxon)
  6. 【Python自动化测试20】接口自动化测试框架模型搭建
  7. Python中 如何将一个字符串分成一个个字符;
  8. 手机设计中的软件和硬件
  9. totolink固件获取(硬件方法)
  10. 盛大云主机使用感受1