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

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四虎| 日韩欧美中文字幕一区二区| 亚洲免费视频区一区二| 国产av剧情日韩精品| 真人国产一级美女免费视频| 麻豆乱淫一区二区三爱免费| 风韵犹存丰满大屁股熟妇| 91黄色国产在线播放| 日本午夜理论视频在线播放| 亚洲一区二区三区日韩欧美| 国产中文精品字幕a区| 亚洲成人精品免费观看| 国产黄片一区二区在线| 亚洲ve中文字幕久久一区二区 | 国产成年人在线免费观看| 国产一级黄色免费大片| 另类亚洲欧美专区第一页| 午夜神马福利激情视频| 91一区二区亚洲嫩草| 国产美女极度色诱视频| 九九热视频这里是精品| 国产网红女主播视频一区二区| 婷婷亚洲五月伊人91| 亚洲黄色成人免费观看| 一区二区日韩视频九一蜜桃| 国产av麻豆全部免费| 国产精品欧美日韩中文| 欧美日韩另类激情免费| 亚洲av一区二区在线看| 国产精品麻豆久久av| av成熟一区二区三区| 91欧美一区二区在线视频| 免费在线观看av不卡| 中文在线中文天堂黄色片| 欧美 国产 综合 日韩| 国产日韩手机在线不卡视频| 亚洲精品成人中文字幕| 亚洲熟女熟妇另类中文|