亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

node文件讀寫+node執(zhí)行python文件

系統(tǒng) 3259 0

一、node文件讀寫

Node.js讀取文件函數(shù)語法如下:

?

1. 異步讀文件

fs.readFile(filename,[encoding],[callback(err,data)])

  • filename(必選),表示要讀取的文件名。
  • encoding(可選),表示文件的字符編碼。
  • callback 是回調(diào)函數(shù),用于接收文件的內(nèi)容。

示例:

            
              var fs=require('fs');

fs.readFile('./data/result.txt', 'utf-8', function (err, stdout) {
  if (err) {
    console.log('文件讀取失敗');
  } else {
    console.log('文件讀取成功');
    res.render('index', {
      input: description,
      content: stdout,
    })
    console.log('stdout:', stdout);
    stdout = '';
  }
});
            
          

?

PS:read和readFile比較

read 是不斷地將文件中的一小塊內(nèi)容讀入緩存區(qū),最后從該緩存區(qū)中讀取文件內(nèi)容,
而readFile 則是將文件一次性讀取完畢,如果文件較大,則會出現(xiàn)"爆倉"。

?

2.異步寫文件

fs.writeFile(filename,data,[options],callback)

  • filename:要寫入的文件
  • data:寫入文件的數(shù)據(jù)可以是字符串,可以是buffer
  • options:flag:對寫入文件的操作默認為w,encoding:編碼,mode:權限
  • callback:回調(diào)函數(shù)

?

以下介紹下常見的文件的操作 flag, 詳細文件操作區(qū)別請看這篇文章

? flag: w -- 新建只寫(以 w 方式打開,不能讀出,w+ 可讀寫)

? ? ? ? ? ? ? a -- 附加寫方式?(a:附加寫方式打開,不可讀;a+:?附加讀寫方式打開)

? 如果文件不存在會創(chuàng)建新文件的打開方式:a,a+,w,w+,而? r 和 U 要求文件必須存在

?

示例:

            
              // 引入fs
var fs = require("fs");

// 獲取用戶提交的內(nèi)容
var description = req.body.description;

// 寫入文件
fs.writeFile('./data/text.txt', description, {
  flag: 'w',
  encoding: 'utf-8',
  mode: '0666'
}, function (err) {
  if (err) {
    console.log("文件寫入失敗")
  } else {
    console.log("文件寫入成功");
  }
});
            
          


3.同步讀寫文件

            
              var date = fs.readFileSync('log.txt','utf-8');

fs.writeFileSync('output.txt', JSON.stringify(obj, null, '\t'));
            
          

?

4.同步與異步讀寫的區(qū)別

? 同步會阻塞,阻塞時,代碼不能做其它的事情,需要等待當前代碼執(zhí)行完畢, 而異步則無需等待當前代碼執(zhí)行完畢。

?

二、node執(zhí)行python文件

?

1.?child_process介紹

Node.js 是以單線程的模式運行的,但它使用的是事件驅(qū)動來處理并發(fā)。這樣有助于我們在多核 cpu 的系統(tǒng)上創(chuàng)建多個子進程,并使用主進程和子進程之間實現(xiàn)通信,從而提高性能。

每個子進程總是帶有三個流對象:child.stdin, child.stdout 和child.stderr。他們可能會共享父進程的 stdio 流,或者也可以是獨立的被導流的流對象。

Node 提供了? child_process ?模塊來創(chuàng)建子進程。

?

2. 創(chuàng)建子進程方法

  • exec-child_process.exec? ? ? ? ?

使用子進程執(zhí)行命令,緩存子進程的輸出,并將子進程的輸出以回調(diào)函數(shù)的形式返回。

示例:

            
              var child_process = require('child_process');

var workerProcess = child_process.exec('python3 test.py '+i, function (error, stdout, stderr) {
  if (error) {
      console.log(error.stack);
      console.log('Error code: '+error.code);
      console.log('Signal received: '+error.signal);
  }
  console.log('stdout: ' + stdout);
  console.log('stderr: ' + stderr);
});

workerProcess.on('exit', function (code) {
  console.log('子進程已退出,退出碼 '+code);
});
            
          

?

  • spawn-child_process.spawn? ?

使用指定的命令行參數(shù)創(chuàng)建進程。

示例:

            
              var child_process = require('child_process');

var workerProcess = child_process.spawn('python3', ['test.py']);

workerProcess.stdout.on('data', function (data) {
  console.log('stdout: ' + data);
});

workerProcess.stderr.on('data', function (data) {
  console.log('stderr: ' + data);
});

workerProcess.on('close', function (code) {
  console.log('子進程已退出,退出碼 ' + code);
});
            
          

?

  • fork-child_process.fork? ? ? ? ? ? ?

是spawn()的特殊形式,用于在子進程中運行模塊,與spawn方法不同的是,fork會在父進程與子進程之間,建立一個通信管道,用于進程之間的通信。

暫無示例

?

3. 比較exec和spawn

  1. exec將子進程輸出結果暫放在buffer中,在結果完全返回后,再將輸出一次性的以回調(diào)函數(shù)返回。如果exec的buffer體積設置的不夠大,它將會以一個“maxBuffer exceeded”錯誤失敗告終。而spawn在子進程開始執(zhí)行后,就不斷的將數(shù)據(jù)從子進程返回給主進程,它沒有回調(diào)函數(shù),它通過流的方式發(fā)數(shù)據(jù)傳給主進程,從而實現(xiàn)了多進程之間的數(shù)據(jù)交換。
  2. 書寫上,exec更方便一些,將整個命令放在第一個參數(shù)中,而spqwn需要拆分。
    child_process.spawn('python3', ['test.py', i])
    child_process.exec('python3 test.py '+i, callback)
  3. exec比spawn多了一些默認的option

?

4.解決 Error: maxBuffer exceeded

?

問題描述:

在使用子進程期間遇到了問題?Error: stderr maxBuffer exceeded ,然后 子進程掛掉。

?

原因:

讓我們從源碼上解釋子進程為什么子進程會掛掉?

            
              child.stderr.addListener('data', function(chunk) {
    stderrLen += chunk.length;
 
    if (stderrLen > options.maxBuffer) {
      ex = new Error('stderr maxBuffer exceeded.');
      kill();
    } else {
      if (!encoding)
        _stderr.push(chunk);
      else
        _stderr += chunk;
    }
});

            
          

以上代碼邏輯:

記錄子進程的log大小,一旦超過 maxBuffer kill 掉子進程。

而當我們在使用 exec 時,不知道設置 maxBuffer ,默認的 maxBuffer 是200K,當我們子進程日志達到200K時,自動 kill() 掉了。

            
              // exec 默認的參數(shù)
var options = {
    encoding: 'utf8',
    timeout: 0,
    maxBuffer: 200 * 1024,
    killSignal: 'SIGTERM',
    cwd: null,
    env: null
};

            
          

?

解決方案

知道上面原因了,解決方案就有幾個了:

  1. 子進程的系統(tǒng),不再輸出日志
  2. maxBuffer這個傳一個足夠大的參數(shù)
  3. 直接使用spawn,放棄使用exec

我這里采用的是第三種直接使用 spawn ,解除 maxBuffer 的限制,個人覺得最優(yōu)的方案。因為exec本身就是

?

結束

node文件讀寫+node執(zhí)行python文件_第1張圖片

?

?


更多文章、技術交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产日韩欧美综合一区二区三区 | 国产一区国产二区国产三区 | 天天看片日日夜夜 | 国产精品成人h片在线 | 国产精品午夜激爽毛片 | 久草在线在线精品观看 | 亚洲国产成人精品一区91 | 女人18特级一级毛片免费视频 | 色姑娘色综合 | 国产精品视频专区 | 精品免费久久久久久成人影院 | 狠狠色欧美亚洲综合色黑a 狠狠色视频 | 天天草天天干 | 日本大片免费一级 | 97看剧网| 免费国产成人综合 | 国产精品成人亚洲 | 一级毛片免费网站 | 欧洲毛片 | 天天干天天射天天爽 | 亚洲香蕉国产高清在线播放 | 亚洲精品综合久久中文字幕 | 你懂得在线网站 | 久草在线免费播放 | 免费视频久久久 | 嫩小xxxxx性bbbbb孕妇 | 一区二区三区美女视频 | 久久精品亚洲一区二区三区浴池 | 精品一久久香蕉国产线看观 | 午夜视频国产 | 成人午夜啪啪免费网站 | 一级毛片在线播放 | freexxxx性特大另类ww | 日本久久黄色 | 欧美综合中文字幕久久 | 99精品久久久久久久婷婷 | 五月婷婷亚洲综合 | 日本一级毛片免费播 | 美女很黄很黄免费的 | 国产精品久久久久久久久免费 | 强制高潮18xxxxhd日韩 |