bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

Node.Js中更快的數(shù)據(jù)傳輸方式

這篇文章主要介紹“Node.Js中更快的數(shù)據(jù)傳輸方式”,在日常操作中,相信很多人在Node.Js中更快的數(shù)據(jù)傳輸方式問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Node.Js中更快的數(shù)據(jù)傳輸方式”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

10多年的洛浦網(wǎng)站建設經(jīng)驗,針對設計、前端、開發(fā)、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。成都營銷網(wǎng)站建設的優(yōu)勢是能夠根據(jù)用戶設備顯示端的尺寸不同,自動調(diào)整洛浦建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設計,從而大程度地提升瀏覽體驗。成都創(chuàng)新互聯(lián)公司從事“洛浦網(wǎng)站設計”,“洛浦網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。

在Node.js中,當我們給前端返回一個靜態(tài)文件的時候,我們通常會把文件先讀進內(nèi)容,然后通過socket接口寫到底層,從而返回給前端。無論是一次性讀取到內(nèi)存還是使用流式的方式,都不可避免地要把數(shù)據(jù)從內(nèi)核復制到用戶層,再把數(shù)據(jù)復制到內(nèi)核,這是一種低效的方式,因為多了無效的復制。在nginx中,可以通過sendfile指令提供效率。Node.js的copyFile底層使用了sendfile系統(tǒng)調(diào)用,但是網(wǎng)絡IO的時候,沒有使用該API。因為Node.js通過隊列的方式,控制數(shù)據(jù)的寫入。那么是否可以實現(xiàn)sendfile的方式來提供這網(wǎng)絡IO的效率。首先我們看一下sendfile的好處是什么。

  • sendfile() copies data between one file descriptor and another. Because this  copying is done within the kernel, sendfile() is more efficient than the  combination of read(2) and write(2), which would require transferring data to  and from user space.

我們看到sendfile通過把內(nèi)核完成數(shù)據(jù)的傳輸,減少了內(nèi)核和用戶層的數(shù)據(jù)復制,從而提高了效率。下面我們通過napi寫一個addon來實現(xiàn)這個功能。

#include <sys/sendfile.h>  #include <stdio.h>  #include <unistd.h> #include <fcntl.h> #include <node_api.h> static napi_value copyFile(napi_env env, napi_callback_info info) {   size_t argc = 3;   napi_value args[3];   // 拿到js層的入?yún)ⅲ@里是三個   napi_get_cb_info(env, info, &argc, args, NULL, NULL);   int fd1;   int fd2;   int len;   // js傳入的是一個數(shù)字,v8轉(zhuǎn)成了對象,這里再次把入?yún)⑥D(zhuǎn)成int型   napi_get_value_int32(env, args[0], &fd1);   napi_get_value_int32(env, args[1], &fd2);   napi_get_value_int32(env, args[2], &len);   int writed = sendfile(fd2, fd1, 0,len);   napi_value ret;   napi_create_int32(env, writed, &ret);   return ret; }  napi_value Init(napi_env env, napi_value exports) {   napi_value func;   // 創(chuàng)建一個函數(shù)并且設置為exports對象的getArray屬性的值   napi_create_function(env,                       NULL,                       NAPI_AUTO_LENGTH,                       copyFile,                       NULL,                       &func);   napi_set_named_property(env, exports, "copyFile", func);   return exports; } NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)

下面我們看看怎么使用。首先用這個addon來復制文件,類似Node.js的copyyFile

const fs= require('fs'); const { copyFile } = require('./build/Release/sendfile.node'); const {   O_WRONLY,   O_CREAT, } = fs.constants; async function test() {   const [fd1, fd2] = await Promise.all([openFile('1.txt', 'r'), openFile('2.txt', O_WRONLY | O_CREAT)]);   const { size } = await getFileInfo(fd1);   console.log(copyFile(fd1, fd2, size));   fs.close(fd1, () => {});   fs.close(fd2, () => {}); } function openFile(filename, mode) {   return new Promise((resolve, reject) => {     fs.open(filename, mode, (err, fd) => {       if (err) {         reject(err);       } else {         resolve(fd);       }     });   })}  function getFileInfo(fd) {   return new Promise((resolve, reject) => {     fs.fstat(fd, (err, stat) => {       if (err) {         reject(err)       }else {         resolve(stat);       }     });   }) } test();

執(zhí)行上面代碼,我們可以看到文件會成功復制2.txt。接著我們再來試一下網(wǎng)絡IO的場景。

const fs= require('fs'); const http = require('http'); const { copyFile } = require('./build/Release/sendfile.node'); const server = http.createServer(async (req, res) => {   const fd = await openFile('1.txt', 'r');   const { size } = await getFileInfo(fd);   const ret = copyFile(fd, res.socket._handle.fd, size);   res.socket.end(); }).listen(8002);  const {   O_WRONLY,   O_CREAT, } = fs.constants;  function openFile(filename, mode) {   return new Promise((resolve, reject) => {     fs.open(filename, mode, (err, fd) => {       if (err) {         reject(err);       } else {         resolve(fd);       }     });   })}  function getFileInfo(fd) {   return new Promise((resolve, reject) => {     fs.fstat(fd, (err, stat) => {       if (err) {         reject(err)       }else {         resolve(stat);       }     });   })}

以上代碼首先啟動一個http服務器,然后收到請求的時候,通過addon調(diào)用sendfile給前端返回對應的內(nèi)容,最后關閉連接。結(jié)果如下。

Node.Js中更快的數(shù)據(jù)傳輸方式

sendfile似乎在網(wǎng)絡IO中可以應用了,但只是一個demo的思路,后續(xù)有時間繼續(xù)研究分析。

到此,關于“Node.Js中更快的數(shù)據(jù)傳輸方式”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

名稱欄目:Node.Js中更快的數(shù)據(jù)傳輸方式
分享地址:http://vcdvsql.cn/article6/gjdiig.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站全網(wǎng)營銷推廣外貿(mào)網(wǎng)站建設服務器托管網(wǎng)站導航微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)