這篇文章主要介紹“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é)果如下。
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)