欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

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

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

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

在Node.js中,當(dāng)我們給前端返回一個(gè)靜態(tài)文件的時(shí)候,我們通常會(huì)把文件先讀進(jìn)內(nèi)容,然后通過(guò)socket接口寫到底層,從而返回給前端。無(wú)論是一次性讀取到內(nèi)存還是使用流式的方式,都不可避免地要把數(shù)據(jù)從內(nèi)核復(fù)制到用戶層,再把數(shù)據(jù)復(fù)制到內(nèi)核,這是一種低效的方式,因?yàn)槎嗔藷o(wú)效的復(fù)制。在nginx中,可以通過(guò)sendfile指令提供效率。Node.js的copyFile底層使用了sendfile系統(tǒng)調(diào)用,但是網(wǎng)絡(luò)IO的時(shí)候,沒(méi)有使用該API。因?yàn)镹ode.js通過(guò)隊(duì)列的方式,控制數(shù)據(jù)的寫入。那么是否可以實(shí)現(xiàn)sendfile的方式來(lái)提供這網(wǎng)絡(luò)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通過(guò)把內(nèi)核完成數(shù)據(jù)的傳輸,減少了內(nèi)核和用戶層的數(shù)據(jù)復(fù)制,從而提高了效率。下面我們通過(guò)napi寫一個(gè)addon來(lái)實(shí)現(xiàn)這個(gè)功能。

#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];   // 拿到j(luò)s層的入?yún)?,這里是三個(gè)   napi_get_cb_info(env, info, &argc, args, NULL, NULL);   int fd1;   int fd2;   int len;   // js傳入的是一個(gè)數(shù)字,v8轉(zhuǎn)成了對(duì)象,這里再次把入?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)建一個(gè)函數(shù)并且設(shè)置為exports對(duì)象的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)

下面我們看看怎么使用。首先用這個(gè)addon來(lái)復(fù)制文件,類似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í)行上面代碼,我們可以看到文件會(huì)成功復(fù)制2.txt。接著我們?cè)賮?lái)試一下網(wǎng)絡(luò)IO的場(chǎng)景。

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);       }     });   })}

以上代碼首先啟動(dòng)一個(gè)http服務(wù)器,然后收到請(qǐng)求的時(shí)候,通過(guò)addon調(diào)用sendfile給前端返回對(duì)應(yīng)的內(nèi)容,最后關(guān)閉連接。結(jié)果如下。

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

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

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

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

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

廣告

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

小程序開發(fā)
蜜桃av噜噜一区二区三| 日本中文有码视频在线观看| 成人免费视频国产免费| 国产精品色网在线播放| 亚洲精品一区久久狠狠欧美| 亚洲人妖视频在线观看| 国产精品久久黑丝诱惑| 国产精品无遮挡猛进猛出| 精品人妻一区二区三区不卡| 护士一级特黄特色大片| 亚洲欧美熟妇欲乱又伦| 日韩中文字幕资源一区| 中文字幕一区二区精品区| 最新日韩人妻中文字幕一区| 欧美亚洲另类色自拍偷拍| 亚洲福利影院一区久久| 亚洲精品露脸自拍高清在线观看| 欧美日韩国产成人激情| 国产剧免费看视频网站成人| 九九国产精品免费视频| 国外男女性生活在线视频| 在线观看视频网站一卡二卡| 色婷婷亚洲一区二区三区| 久久精品91久久久| 精品人妻av中文字幕乱| 亚洲中文字幕在线乱码| 亚洲国产自拍精品视频| 亚洲国产精品一区性色| 最新日韩一区二区在线| 蜜臀人妻久久一区二区三| 欧美日韩精品视频网站| 日韩人妻av免费电影| 草草视频在线观看网站| 国产白丝精品爽爽久久| 中文字幕乱码一区二区欧美| 一级黄片一区二区三区| 亚洲少妇插进去综合网| 国产剧情av网址观看免费| 国产日韩欧美一区二区丝袜| 国产精品国产三级国产专用| 久久av免费一区二区观看|