最新公告
  • 欢迎您光临网站无忧模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • child_process 在mac上的输出截断问题

    正文概述 掘金(糖安酱)   2020-12-13   594

    背景

    因为业务的选项,最近要在代码中使用child_process 进行一些计算 并通过stdout的形式返回一些计算结果。 但是在本地的mac环境上开发时,发现了一个奇怪的现象,输出的数据被截断了

    child_process 在mac上的输出截断问题

    逻辑代码

    主要的简化代码如下

    • 子进程进行一些计算
    • 输出json数据
    • 退出进程
    • master接受子进程传入的json格式的字符串

    master.js

    const { spawn } = require('child_process');
    
    const path = require('path');
    const { writeFileSync } = require('fs');
    
    const childFilePath = path.resolve(__dirname, './child.js');
    
    const checker = spawn('node', [childFilePath]);
    
    new Promise((resolve, reject) => {
      const resultBuf = [];
    
      checker.stdout.on('data', (data) => {
        resultBuf.push(data);
      });
    
      checker.stderr.on('data', (data) => {
        reject(new Error(`stderr: ${data}`));
      });
    
      checker.on('close', () => {
        const strBuffer = Buffer.concat(resultBuf);
        // buffer 转成 字符串
        const result = strBuffer.toString();
        
        resolve(result);
      });
    })
      .then((res) => {
        writeFileSync(path.resolve(__dirname, './output.json'), res);
      });
    
    
    

    child.js

    // 子进程
    const process = require('process');
    
    const result = [];
    for (let i = 0; i < 10000; i += 1) {
      result.push(i);
    }
    
    process.stdout.write(JSON.stringify(result));
    
    process.exit(0);
    
    
    

    问题现场

    到了1860后面的就直接截断了

    child_process 在mac上的输出截断问题

    添加一个try catch 看一下截断的字符串的最大长度

        try {
          // 这里做特定的解析 如果被截断,就不是标准的json了
          JSON.parse(result);
        } catch (e) {
          // 输出buffer的长度
          console.log(strBuffer.byteLength);
        }
        resolve(result);
    
    

    strBuffer的长度是8192 (这个整数太标准了)

    child_process 在mac上的输出截断问题

    问题就出在了子进程的 process.stdout.write和 process.exit之间

    现象是 buffer作为运载货车,只拉了一趟货 子进程就退出了,剩下的货还都留在原地

    对应的node.js 的issue 有 github.com/nodejs/node…

    官方的文档也有特定的说明 nodejs.org/api/process…

    解决办法

    1. 在process的输出前添加
    process.stdout._handle.setBlocking(true);
    
    process.stdout.write(JSON.stringify(result));
    
    
    1. 去掉 process.exit(0);

    下载网 » child_process 在mac上的输出截断问题

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元