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

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://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免费在线网址| 成人一区二区三区乱码| 男人自拍天堂在线视频| 亚洲av精二区三区四区| 亚洲日本国产精品一区| 日本女同一区二区高清| 国产精品国产自产拍高清| 精品少妇一区二区三区| 亚洲一级特黄大片在线观看| 91国产精品视频在线| 亚洲高清成人综合网站| 黄色片在线观看中文字幕| 国产一区二区三区不卡av| 亚洲一区二区中文字幕av| 精品亚洲一区二区三区| 精品三级黄色国产片| 麻豆午夜视频免费在线观看| 日本在线免费高清观看| 亚洲视频一区二区精品| 日本一区二区三区高清| 一本之道久久成人综合| 国产老熟女高潮视频| 日本在线高清不卡免费播放| 亚洲一区二区婷婷久久| 西西美女掰开阴让你看| 国产原创av剧情六区| 成人18禁视频免费看| 91在线国产精品视频| 日本av高清视频在线观看| 国产午夜在线影院一区二区| 日韩在线啊啊啊的视频| 国产精品欧美日韩高清| 加勒比久草免费在线观看| 蜜臀av在线国产一区| 蜜臀在线观看免费视频| 亚洲人妻不卡一区二区| 午夜激情毛片在线观看|